我无法理解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
答案 0 :(得分:4)
通常,作为接收者的self
可以省略,在这种情况下,通常最好这样做。但是,在某些情况下,省略self
会使代码意味着其他内容。
就像你的例子self.name = ...
中一样,使用setter方法。 Ruby的语法在方法和变量调用之间是模糊的,当可以解释为变量或方法的某些东西后面跟=
时,它作为局部变量赋值的解释具有优先权。
另一种情况是您想要调用方法class
。还有关键字class
,class
的解释作为关键字优先于其作为方法。
还有一种情况是您想要使用方法[]
。此表示法也用于数组文字,并将其解释为数组优先于它作为方法。
在每种情况下,您都必须使表达式无法用于方法调用。一种方法是即使在self
时明确写入接收器。另一种方法是在方法之后写()
。
关于您的示例self.each_with_index ...
,可以省略self
,但不建议这样做。
答案 1 :(得分:2)
self
与实例方法和类方法之间的区别绝对没有任何关系。事实上,并不是甚至是它们之间的区别,因为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