2013-03-08 91 views
3

即时了解自我的关键字。我了解它如何用于区分实例方法和类方法,但是在方法中使用它的时候又该如何。红宝石自己的关键字

喜欢的东西

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 
+0

请参考的解释在这里: http://stackoverflow.com/questions/8844703/how-to-use-self-keyword-in-rails – 2013-03-08 15:55:04

回答

4

通常,作为接收器的self可以省略,在这种情况下,通常优选这样做。但是,在少数情况下,省略self会使代码具有其他意义。

  • 例如self.name = ...这样的一种情况是使用setter方法。 Ruby的语法在方法和变量调用之间是不明确的,当某些可以被解释为变量或方法的东西之后是=时,它作为局部变量赋值的解释具有优先权。

  • 另一种情况是当你想调用方法class。还有关键字class,以及关键字class的解释优先于该方法。

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

在每一种情况下,你必须做出的表情是unamgiguously一个方法调用。一种方法是明确写入接收器,即使它是self。另一种方法是在方法后写()

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

+0

所以,自我在那里消除了对某物所属的地方的任何歧义。我有没有得到那个权利? – 13driver 2013-03-08 15:59:41

+0

是的,意思是:原则上是模棱两可的,当被Ruby的偏好规则覆盖时。 – sawa 2013-03-08 16:04:10

+0

非常感谢。 (我真的需要习惯如何使用上下文ruby) – 13driver 2013-03-08 16:09:22

0

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

class MyClass 
    def self.myMethod 
    "hello" 
    end 
end 

MyClass.myMethod 

而没有自我的方法是一个实例方法:

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 
+0

的OP是问'self.name = “TEXT”,并且已经理解实例和类方法。 – 2013-03-08 15:15:42

+0

按下“保存”太快,没有完成。 – pduersteler 2013-03-08 15:16:53

+0

我已经知道了,我问起使用方法里面的自我。 – 13driver 2013-03-08 15:19:46

1

自己实际上在Ruby中定义了您的作用域。从模块到类,类到方法等切换时,范围保持不变。

2

self与实例方法和类方法之间的区别完全没有任何关系。其实并不是它们之间的区别,因为Ruby不是类的方法。 Ruby只有实例方法。

在红宝石self恰好中的每个其他面向对象的语言相同self(或有时称为this):它是到当前对象的引用。就是这样。它实际上只是一个指向“我自己”的指针。