1

如果我有这样的课程:

class Person

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

  def name=(name)
    @name = name
  end

end

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

class Person

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

  def name=(name)
    @name = name
  end

end

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

4

2 回答 2

7

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

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

没有任何语法可以表示您要创建局部变量,因此必须是默认值。

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

于 2013-06-29T04:55:54.957 回答
-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 中被作为一种特殊情况处理。

根据Ruby 编程语言

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

再说一遍,并不是 Ruby 不知道self在构造函数的执行过程中指的是什么——它确实知道——而是在这种情况下你试图调用一个 setter,这需要通过一个对象来调用。

在您的代码中,name = options[:name]创建并设置一个名为name.

于 2013-06-29T05:21:19.120 回答