我试图了解self
关键字在以下示例中的工作原理:
class Test
attr_accessor :field
def without_self
[1,2,3].each { |x| field = x }
end
def with_self
[1,2,3].each { |x| self.field = x }
end
end
t = Test.new
t.without_self
t.field # => nil
t.with_self
t.field # => 3
我试图将这种行为融入我对“自我”如何运作规则的更大理解中。请更正以下错误,或添加任何说明或简化:
在方法内部(但不在该方法中的块/ proc / lambda内),“self”隐含在定义方法的对象上,因此在另一个方法前面显式添加它你打电话从不改变行为。
在方法定义前面添加“self”会将该方法转换为类方法。我应该将此理解为自己的规则还是上述规则1的特例?也就是说,它们是否都应用了关于如何在解析时解释自我的更一般规则?在一个类中,self引用了类对象,在一个方法里面self引用了该方法的拥有对象?
为什么自我的解释会改变块内的行为,就像在我的示例代码中一样?规则是这样的:块有自己的局部范围,这是默认的,但是如果你明确地添加“self”,ruby假设你的意思是块的父对象,因为块没有“self”的概念,否则?
在所有情况下,围绕“自我”及其解释的规则是否解析时间规则?
答案 0 :(得分:2)
广告。 2是的,在一个类中,self
引用了类对象,这就是def self.method_name
定义类方法的原因。这是singleton method的一个特例。
广告。 3不,它与块没有任何关系。只有当你编写field = x
时,Ruby才会将其视为局部变量赋值。这就是为什么如果你调用setter方法you should specify reciever explicitly,即使它是self
。
答案 1 :(得分:1)
read_attribute
在上面的例子中,self是否在方法体或块体中使用并不重要,但如果我们只想读取类中任何属性的值,那么我们不需要先放入self方法。
write_attribute or update_attribute
但是如果我们想要编写或更新任何属性,则必须在该属性之前使用self。