如果我有这样的课程:
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'构造函数中按预期设置,因此它将作为第一个示例。
答案 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
的本地变量。