gpt4 book ai didi

Ruby - 实例方法 : why can i use getter without self, 但 setter 仅与 self

转载 作者:数据小太阳 更新时间:2023-10-29 07:25:50 26 4
gpt4 key购买 nike

我已经使用 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

我们这里有:

  1. 使用@in_progress 变量的getter 和setter 类游戏
  2. @in_progress 默认为 false
  3. 我们开始吧!方法并尝试将 in_progress 更改为 true
  4. in_progress 的 setter/getter 效果很好
  5. Setter 只与自己一起工作。或者通过@in_progress 直接访问变量

我读到了 Ruby 中的方法查找(向右一步进入接收者的类,然后沿着祖先链向上移动,直到找到方法。)但我真的不知道为什么我必须使用 self.in_progress=true 来访问 setter 方法。尤其是当 getter 方法在没有 self 的情况下工作时。

提前致谢!

最佳答案

因为您正在为函数中的局部变量 in_progress 赋值,而不是实例变量。 getter 起作用是因为 Ruby 会查询 start! 函数的本地命名空间以查找 in_progress,它不会找到它,然后它会查询实例命名空间,它会找到一个方法调用 in_progress 并将调用它。

Ruby 解释器无法确定您是否要在本地 in_progress 或实例变量上分配 true 值,因此规则是分配它在本地(到 start! 中的当前命名空间)。

关于Ruby - 实例方法 : why can i use getter without self, 但 setter 仅与 self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19617169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com