Ruby 为什么是';自我';这里是否需要一个实例变量?

Ruby 为什么是';自我';这里是否需要一个实例变量?,ruby,Ruby,在codeschool的一节课中,左上角块中的代码被证明是不正确的 “当然是了,”我对自己说。我学会了它应该是@name=name。有什么新问题?为什么这里需要“自我”呢?请参见下面我的工作代码: class UserList attr_accessor :name def initialize(name) @name = name end end list = UserList.new('celebrities') list.name self在这

在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\u accessor
。你说得对

@name     = name
self.name = name
它们是等价的

但一方面,为什么选择
attr\u访问器
(而不是
attr\u阅读器
),然后写
@name=
?学习的一部分是创建setter方法。对
@name=
使用
attr\u访问器是没有用的

另一方面,他们想指出另一个重要的细节:即使
attr\u accessor
创建了一个方法
def name=(name)
,这其中的任何一个都不会起作用:

name = name
name = 'Bart'
因为它永远不会更改基础的
@name
变量,甚至不会触及使用
attr\u访问器创建的方法。它将更改局部变量
名称


这是一项重要的学习。了解
name=
self.name=

之间的区别,目前正在仔细阅读,只是为了对下面的答案做一点详细说明,这里由
attr\u accessor
生成的方法
name=()
,必须有一个应用该方法的接收器
self.name=
指定接收者是
self
,这里它等于类
UserList
的一个实例。如果您没有指定接收者(只是
name=
),Ruby假设接收者是
self
,所以这里它是可选的。请注意,在其他情况下,
self
的使用不是可选的。在这种特定情况下,它是等效的,但这只是因为
name=
方法是由
attr\u访问器定义的,如果你有一个
name=
方法,它确实做了一些有趣的事情,那么
@name='name'
self.name='name'
就不一样了。啊。。。所以学校应该让我知道特殊的情况。。。也许是在一个即将到来的时刻lesson@dwilbank:我希望如此,这个例子是相当肤浅和误导性的(除非有更多我看不到的内容)。
a=b
中可能存在一些歧义,是将
b
赋值给局部变量
a
,还是调用
self
上的
a=
方法?歧义被分解为“局部变量
a
”的情况,因为否则就没有合理的方法来创建局部变量(除非有关键字(
my
var
,…);如果您想调用
a=
mutator方法,那么您必须手动解决歧义并说
self.a=