class Carnivore
def roar=(v)
@roar = v
end
def roar
@roar
end
end
trex = Carnivore.new
trex.roar = "GRRRxxz"
puts trex.roar
使用的操作系统:Windows 10.
我正在使用IRB并使用一些getter / setter方法。如果我删除了setter方法roar=(v)
,那么阅读器方法仍然有效,并且将打印出#34; GRRRxxz"。但是,如果我退出IRB并启动另一个会话,IRB将给我一个错误。请注意,我每次使用load关键字加载文件,即:load "test.rb"
。
更不寻常的是,如果我在删除setter方法后更新puts
,它会将puts
更新为任何内容(即:将GRRRxxz设置为YOOO,它会改变到YOOO)。
有人可以向我解释为什么IRB会以这种方式运作吗?它似乎是出于某种莫名其妙的原因而保存了setter方法。如果删除reader方法,它也会做同样的事情(如果删除writer方法仍然有效,但退出并重新启动IRB会使其失败)。
任何帮助将不胜感激!
答案 0 :(得分:3)
IRB与此无关。这是红宝石的一个特色叫做“公开课”
因此,当您第一次加载Carnivore
类时,它将完整加载,因为它之前不存在。但是如果您随后删除文件中的方法并重新加载它,那么会发生什么是ruby 打开您的类并添加一个getter方法。它已经有了,所以它被覆盖了。这解释了为什么会反映方法体的变化(那里的puts
)。
这项技术正在推动所谓的“猴子修补”。你可以在ruby中修补任何类,甚至是系统类。
class String
def pirate
self + ', arrrr!'
end
end
'hello'.pirate # => "hello, arrrr!"
你看,它“修补”现有的课程。如果此类定义替换/遮蔽了系统中的那个,那么您的应用程序将会非常破碎。