3

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

4 回答 4

5

通常,self由于可以省略接收器,在这种情况下,通常最好这样做。但是,在某些情况下,省略self使代码具有其他含义。

  • 一种这样的情况是,如在您的示例self.name = ...中,使用 setter 方法。Ruby 的语法在方法和变量调用之间是模棱两可的,当可以解释为变量或方法的内容后跟 时=,将其解释为局部变量赋值具有优先权。

  • 另一种情况是当您要调用方法时class。还有关键字classclassas关键字的解释优先于方法。

  • 还有一种情况是当您想使用该方法时[]。这种表示法也用于数组字面量,将其解释为数组优先于作为方法。

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

关于你的例子self.each_with_index ...self可以省略,不这样做不是推荐的做法。

于 2013-03-08T15:34:35.833 回答
3

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

self在 Ruby 中,与其他所有面向对象语言中的(或有时称为)完全相同:它是对当前对象的引用。就是这样。它实际上只是一个指向“我自己”的指针。selfthis

于 2013-03-08T15:29:22.653 回答
1

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

于 2013-03-08T15:15:41.530 回答
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
于 2013-03-08T15:15:16.197 回答