我使用 Ruby 一段时间了。现在我要更深入地挖掘并找到我所遇到的问题的所有答案。
我希望我能在这里找到这个问题的答案。所以这是我在下面的代码中的问题:
class Game
attr_accessor :in_progress
def initialize
@in_progress = false
end
def start!
# debug info
puts self.inspect # => #<Game:0x8f616f4 @in_progress=false>
puts self.class.instance_methods(false) # => [:in_progress, :in_progress=, :start!]
puts self.instance_variables # => [:@in_progress]
puts self.respond_to?("in_progress=") # => true
puts in_progress # => true - getter works without self
# main quesion
in_progress = true # Why setter doesn't work without self?
# self.in_progress = true # this would work and set @in_progress to true becase setter called
# @in_progress = true # this would work as well because we set instance variable to true directly
end
end
g = Game.new
g.start!
puts g.in_progress # => false - setter in start! method didn't work
我们这里有什么:
- 带有 @in_progress 变量的 getter 和 setter 的类游戏
- @in_progress 默认为 false
- 我们叫开始!方法并尝试将 in_progress 更改为 true
- in_progress 的 Getter 效果很好
- Setter 只与 self 一起工作。或者通过@in_progress直接访问变量
我读到有关 Ruby 中的方法查找的内容(向右一步进入接收者的类,然后沿着祖先链向上,直到找到该方法。)
但我真的不知道为什么我必须使用 self.in_progress=true 来访问 setter 方法。特别是当 getter 方法在没有 self 的情况下工作时。
提前致谢!
因为您正在为局部变量赋值in_progress
在函数中,而不是实例变量中。 getter 起作用是因为 Ruby 将查询该对象的本地命名空间start!
函数为in_progress
,它不会找到它,然后它会查询实例命名空间,它会找到一个名为的方法in_progress
并会调用它。
Ruby 解释器无法确定您是否要分配true
在当地的价值in_progress
或者在实例变量上,所以规则是在本地分配它(到当前命名空间start!
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)