怎么"自我"在方法内的Enumerable块内部工作

时间:2014-05-09 07:03:15

标签: ruby

我试图了解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

我试图将这种行为融入我对“自我”如何运作规则的更大理解中。请更正以下错误,或添加任何说明或简化:

  1. 在方法内部(但不在该方法中的块/ proc / lambda内),“self”隐含在定义方法的对象上,因此在另一个方法前面显式添加它你打电话从不改变行为。

  2. 在方法定义前面添加“self”会将该方法转换为类方法。我应该将此理解为自己的规则还是上述规则1的特例?也就是说,它们是否都应用了关于如何在解析时解释自我的更一般规则?在一个类中,self引用了类对象,在一个方法里面self引用了该方法的拥有对象?

  3. 为什么自我的解释会改变块内的行为,就像在我的示例代码中一样?规则是这样的:块有自己的局部范围,这是默认的,但是如果你明确地添加“self”,ruby假设你的意思是块的父对象,因为块没有“self”的概念,否则?

  4. 在所有情况下,围绕“自我”及其解释的规则是否解析时间规则?

2 个答案:

答案 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。