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