【发布时间】:2013-01-30 12:07:17
【问题描述】:
Getter 方法可以在没有显式接收器的情况下使用,除非存在同名的局部变量:
class A; attr_reader :foo end
A.new.instance_eval do
@foo = :foo
p foo
end
# => :foo
当存在同名的局部变量时,这将不成立,因为当存在歧义时,作为局部变量的解释比作为方法调用具有优先级的原则。
class A; attr_reader :foo end
A.new.instance_eval do
foo = :bar
@foo = :foo
p foo
end
# => :bar
然而,setter 方法不能在没有显式接收器的情况下使用,即使在所讨论的表达式之前没有分配同名的局部变量:
class A; attr_writer :foo end
A.new.instance_eval do
foo = :foo # <= No local variable named `foo` has been assigned before this point
p @foo
end
# => nil
setter 方法的这种“反私有”属性如何证明?
【问题讨论】:
-
这是怎么回事?我不明白。设置器不是私有方法。
-
@m_x 他们不是。我在写反私人。不是私人的。
-
为什么二传手是私有的? setter 的重点是将字段公开给公共接口。或者我不明白你所说的“反私人”是什么意思
-
@sawa
private在 ruby 中定义了曝光,所以 m_x 在这个问题上给你打电话是绝对正确的。可能不清楚您所说的反私有是什么意思,即使我理解您的意思是当变量在其(用您的话是私有的)范围内定义时,对象不会隐式使用设置器,但没有必要对此粗鲁. -
是的,我知道私有在 ruby 中的含义。您的问题最好改写为“为什么二传手在 ruby 中需要一个明确的接收者?”。我认为@BeatRichards 解释得很好。作为旁注,AFAIK“反隐私”是你的发明,在官方文档中找不到,所以请不要再看不起那些诚实地试图理解你的问题并帮助你的人。