Ruby自己的关键字

时间:2013-03-08 15:12:39

标签: ruby self

我无法理解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

4 个答案:

答案 0 :(得分:4)

通常,作为接收者的self可以省略,在这种情况下,通常最好这样做。但是,在某些情况下,省略self会使代码意味着其他内容。

  • 就像你的例子self.name = ...中一样,使用setter方法。 Ruby的语法在方法和变量调用之间是模糊的,当可以解释为变量或方法的某些东西后面跟=时,它作为局部变量赋值的解释具有优先权。

  • 另一种情况是您想要调用方法class。还有关键字classclass的解释作为关键字优先于其作为方法。

  • 还有一种情况是您想要使用方法[]。此表示法也用于数组文字,并将其解释为数组优先于它作为方法。

在每种情况下,您都必须使表达式无法用于方法调用。一种方法是即使在self时明确写入接收器。另一种方法是在方法之后写()

关于您的示例self.each_with_index ...,可以省略self,但不建议这样做。

答案 1 :(得分:2)

self与实例方法和类方法之间的区别绝对没有任何关系。事实上,并不是甚至是它们之间的区别,因为Ruby没有拥有类方法。 Ruby只有实例方法。

Ruby中的

self 与其他所有面向对象语言中的self(或有时称为this)完全相同<:>它是一个引用当前的对象。这就是全部。它实际上只是指向&#34;我自己&#34;。

答案 2 :(得分:1)

self实际上在Ruby中定义了你的范围。当您从模块切换到类,从类切换到方法等时,范围会不断变化....

答案 3 :(得分:0)

类方法(因为self引用了类):

class MyClass
  def self.myMethod
    "hello"
  end
end

MyClass.myMethod

而没有self的方法是实例方法:

class MyClass
  def myMethod
    "hello"
  end
end

c = MyClass.new
c.hello

对于变量,它也是范围的东西。如果您的班级有访问者,则可以使用self访问该访问者。不使用self通常意味着你想从方法的范围访问局部变量(假设没有给出魔法)。

class MyClass
  attr_accessor :var

  def myMethod
    self.var # => "hello"
    var # => undefined
  end
end