为什么需要'self'从构造函数中调用Ruby方法?

时间:2013-06-29 04:52:42

标签: ruby

如果我有这样的课程:

class Person

  def initialize(options={})
    self.name = options[:name]
  end

  def name=(name)
    @name = name
  end

end

...然后调用'name ='方法,我得到了我的期望。但是,如果我稍微修改示例以将'self'从调用'name ='中删除,则永远不会调用该方法:

class Person

  def initialize(options={})
    name = options[:name]
  end

  def name=(name)
    @name = name
  end

end

这是为什么?为什么必须'自己'在那里?我的印象是隐含的'self'将在'initialize'构造函数中按预期设置,因此它将作为第一个示例。

2 个答案:

答案 0 :(得分:7)

Ruby不知道您是否要创建名为“name”的局部变量或使用成员变量。

self.name告诉你要使用成员变量。

没有任何语法可以说你想创建一个局部变量,所以这必须是默认的。

(另外,成员变量不是真的,但你知道我的意思)

答案 1 :(得分:-2)

为什么需要'self'从构造函数中调用Ruby方法?

一般情况下,它不是:

class Person
  def initialize(options={})
    set_name(options[:name]) # Calls `set_name` method; no `self.` required
  end

  def set_name(name)
    @name = name
  end
end

代码中对self.的需求与构造函数中的无关:您可以在initialize内或类中的其他位置调用任何常规实例方法,而无需使用self.

你正在尝试调用一个setter方法(一个名称以=结尾的实例方法,例如name=),这些方法在Ruby中作为特例处理。 / p>

根据 Ruby编程语言:

  

规则是赋值表达式仅在通过对象调用时调用setter方法。如果要在定义它的类中使用setter,请通过self显式调用它。

再说一次,并不是Ruby不知道self在构造函数的执行过程中引用了什么 - 它确实 - 在这种情况下,你试图调用一个setter,这需要调用透过一个物体。

在您的代码中,name = options[:name]创建并设置一个名为name的本地变量。