Ruby 为什么是';自我';这里是否需要一个实例变量?
在codeschool的一节课中,左上角块中的代码被证明是不正确的 “当然是了,”我对自己说。我学会了它应该是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在这
@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=
。