Ruby和Python中“self”的区别是什么?
我之前学过一些Python,现在刚开始接触Ruby。
我想要一个关于这两种语言中“self”的区别的好解释。
乍一看很明显:
在Python中,self不是一个关键字,但无论你怎么称呼,它都有一个“类似self”的值。
Python的方法会把self作为一个明确的参数传递,而Ruby则不是这样。
在Ruby中,有时候会用点符号明确地将某些方法定义为self的一部分。
初步搜索结果:
http://rubylearning.com/satishtalim/ruby_self.html
http://www.ibiblio.org/g2swap/byteofpython/read/self.html
4 个回答
在编程中,self只是一个约定俗成的写法,你可以用spam、bacon或者sausage来代替self,结果是一样的。它只是传递给绑定方法的第一个参数。不过,还是建议你使用self,因为这样会让别人更容易理解你的代码,也能避免一些编辑器的困惑。
尽管webmat说了什么,Guido曾经写过,明确使用self并不是一种技术上的小把戏,而是一种语义上的设计。
在方法定义中使用明确的self,是为了保持语义上的一致性。如果你写
class C: def foo(self, x, y): ...
这实际上和写
class C: pass
def foo(self, x, y): ... C.foo = foo
是一样的。
这是一个故意的设计决定,而不是后来才引入面向对象行为的结果。
在Python中,所有东西都是对象,包括字面量(比如数字和字符串)。
Python 这个语言不仅仅支持面向对象编程。它让方法和函数之间的接口保持一致,这样两种编程风格可以更好地一起工作。
而 Ruby 则是从一开始就设计成面向对象的。甚至连数字这样的字面量也是对象(你可以输入 1.class 来查看它的类型,结果是 Fixnum)。这个语言的设计使得 self 这个关键词可以用来表示当前的实例,不管你在哪里。
如果你在某个类的实例方法里面,self 就指的是这个实例。
如果你在定义类的时候(不是在方法里面),self 就指的是这个类本身:
class C
puts "I am a #{self}"
def instance_method
puts 'instance_method'
end
def self.class_method
puts 'class_method'
end
end
在定义类的时候,会打印出 'I am a C'。
直接写 'def' 是定义一个实例方法,而 'def self.xxx' 则是定义一个类方法。
c=C.new
c.instance_method
#=> instance_method
C.class_method
#=> class_method