简单的this,麻烦的this
作者:网友投稿 时间:2018-08-31 16:27
周末的Hello World咖啡馆总是热闹非凡。
Java , Python, Ruby, JavaScript围坐在一起,一边喝咖啡,一边海阔天空。
C老头儿则待在一旁,冷眼旁观。
聊着聊着,这话题不知怎么着转移到了“this”上来了。
Java 说: “唉!你们不知道吧,对于一个初学Java的人来说,this 是非常难于理解的。”
Python说:“this 在你那里已经够简单了啊。还难于理解?”
“我们都是支持面向对象编程的,在我这里,this 可以用到实例方法或者构造器中,表示对当前对象实例的引用。”
public class Point {
private double x = 0.0;
private double y = 0.0;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public double distanceTo(Point that) {
double dx = this.x - that.x;
double dy = this.y - that.y;
return Math.sqrt(dx*dx + dy*dy);
}
}
“这不很容易理解吗? ” Ruby 问道。
“对于第一次接触面向对象编程的人来说,他分不清这个当前对象this到底是哪个对象。” Java说,“我必须得再写一段代码给他掰扯一下。”
Point p1 = new Point(1,1);
Point p2 = new Point(2,2);
// this 指向的是p1
p1.distanceTo(p2);
// this 指向的是p2
p2.distanceTo(p1);
“对啊,this必须得有个上下文才能准确理解。” Python说,“还有,你那个this吧,是个隐式的,像我是显式的:”
class Point:
def __init__(this, x, y):
this.x = x
this.y = y
def distanceTo(this,point):
dx = this.x - point.x
dy = this.y - point.y
return math.sqrt(dx**2+dy**2)
Java 说:“你不是一直用self吗,怎么现在是this?”
Python笑道:“我这不是为了和你Java老弟保持一致嘛,反正只是个变量名,你想用this就用this,想用that就用that,只不过我们习惯于用self 。”
Ruby说: “Python兄,你把this放到方法中作为一个参数,实在是太丑陋了,一点美感都没有。”
“那是我们的哲学,我们信奉 Explicit is better than implicit。”
“可是在调用的时候,怎么不把一个对象传给那个方法?你的self去哪里了?”
p1 = Point(1,1)
p2 = Point(2,2)
p1.distanceTo(p2)
p2.distanceTo(p1)
“你怎么不写成: distanceTo(p1,p2) ?”
“那不行,” Python说,“如果那样的话我们就不是面向对象了,而面向过程了。 ”
“哼哼,” C老头儿在一旁冷笑一声,“说来说去,还不是披了一层面向对象的外衣,内部实现依然是面向过程的?!”
“此话怎讲?” Java一直以正统的面向对象自居,不像Python, Ruby ,Java即使是想输出一个Hello World也得定义一个类不可。




