在 codeschool 的一节课中,左上角的代码被证明是不正确的。
“当然是”,我对自己说。我知道它应该是@name = name
。新问题是什么?为什么这里需要“自我”?请参阅下面的工作代码:
class UserList
attr_accessor :name
def initialize(name)
@name = name
end
end
list = UserList.new('celebrities')
list.name
在 codeschool 的一节课中,左上角的代码被证明是不正确的。
“当然是”,我对自己说。我知道它应该是@name = name
。新问题是什么?为什么这里需要“自我”?请参阅下面的工作代码:
class UserList
attr_accessor :name
def initialize(name)
@name = name
end
end
list = UserList.new('celebrities')
list.name
self
这里没有必要。你在做什么是等价的。无论哪种方式都很好。
self.name =
调用name=
设置实例变量的方法@name
。你在做什么是等价的。
Codeschool 在attr_accessor
这里介绍。你是对的
@name = name
self.name = name
是等价的。
但一方面为什么选择attr_accessor
(而不是attr_reader
)然后写@name=
?学习的一部分是attr_accessor
创建一个 setter 方法。使用attr_accessor
with@name=
有点没用。
另一方面,他们想指出另一个重要的细节:即使attr_accessor
创建了一个方法def name=(name)
,这些都不会起作用:
name = name
name = 'Bart'
因为它永远不会改变底层@name
变量,甚至不会触及使用attr_accessor
. 它会改变局部变量name
。
这是一个重要的学习。name=
知道和之间的区别self.name=
。