Ruby是否在IRB中保存某些文件,以便#34;加载"每次都不加载单独的文件版本?

时间:2016-10-26 20:39:48

标签: ruby irb

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会使其失败)。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

IRB与此无关。这是红宝石的一个特色叫做“公开课”

因此,当您第一次加载Carnivore类时,它将完整加载,因为它之前不存在。但是如果您随后删除文件中的方法并重新加载它,那么会发生什么是ruby 打开您的类并添加一个getter方法。它已经有了,所以它被覆盖了。这解释了为什么会反映方法体的变化(那里的puts)。

这项技术正在推动所谓的“猴子修补”。你可以在ruby中修补任何类,甚至是系统类。

class String
  def pirate
    self + ', arrrr!'
  end
end

'hello'.pirate # => "hello, arrrr!"

你看,它“修补”现有的课程。如果此类定义替换/遮蔽了系统中的那个,那么您的应用程序将会非常破碎。