Ruby自己的关键字
我无法理解self关键字。 我了解它是如何用来区分实例方法和类方法的,但是从方法内部使用它的时候呢。
就像是
def self.name self.name = "TEXT" end
要么
def name2 self.name = "TEXT2" end
要么
class Array def iterate!(&code) self.each_with_index do |n, i| self[i] = code.call(n) end end end
通常,可以省略作为接收器的self
,并且在这种情况下,通常优选这样做。 但是,有一些情况下,省略self
使代码意味着别的东西。
-
其中一个例子是,例如
self.name = ...
,使用setter方法。 Ruby的语法在方法和变量调用之间是模糊的,当可以被解释为变量或方法的东西后面跟着=
,它作为局部变量赋值的解释具有优先权。 -
另一种情况是你想要调用方法
class
。 还有关键字class
,作为关键字的class
解释优先于它作为方法。 -
还有一种情况是你想使用方法
[]
。 此表示法也用于数组文字,并将其解释为数组优先于它作为方法。
在每种情况下,您都必须使表达式成为一个方法调用。 一种方法是即使在self
时也明确地写入接收器。 另一种方法是在方法之后写()
。
关于你的示例self.each_with_index ...
, self
可以省略,不这样做不是推荐的做法。
self
对于实例方法和类方法之间的区别绝对没有任何关系。 事实上,它们之间甚至没有区别,因为Ruby没有类方法。 Ruby只有实例方法。
Ruby中的self
与其他所有面向对象语言中的self
(或有时称为this
) 完全相同 :它是对当前对象的引用。 就是这样。 它实际上只是指向“我自己”的指针。
self实际上在Ruby中定义了你的范围。 当您从模块切换到类,类切换到方法等时,范围会不断变化….
类方法(因为self
引用类):
class MyClass def self.myMethod "hello" end end MyClass.myMethod
而没有self的方法是实例方法:
class MyClass def myMethod "hello" end end c = MyClass.new c.hello
对于变量,它也是范围的东西。 如果您的class级有一个访问者,您可以使用self
访问它。 不使用self通常意味着您想要从方法的范围访问局部变量(假设没有给出魔法)。
class MyClass attr_accessor :var def myMethod self.var # => "hello" var # => undefined end end