Ruby的混合链不能正常工作

时间:2012-06-14 09:20:35

标签: ruby-on-rails ruby ruby-on-rails-3

我在Windows上使用Ruby 1.9.3。所以我想通过Kernel类在控制台中添加方法。启动控制台。

module Foo
  def bar
    puts "Method is in scope!!!"
  end
end

将此内容添加到KernelObject类的一部分)

之后
irb(main):008:0> Kernel.send(:include, Foo)
=> Kernel
irb(main):009:0> bar
"NameError: undefined local variable or method `bar' for main:Object"
# did not work, we need to re-include Kernel in Object class
irb(main):010:0> Object.send(:include, Kernel)
=> Object
irb(main):011:0> bar
Method is in scope!!!
=> nil
irb(main):012:0>

这应该仅适用于Kernel.send(:include, Foo)或者我错了吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

是的,在这种情况下,您应该直接扩展Object。但如果您如此倾向,可以扩展Kernel,只是不要忘记再次将其重新包含在Object中。

module Foo
  def bar
    puts "Method is in scope!!!"
  end
end

Kernel.send :include, Foo
# bar at this point will generate error

Object.send :include, Kernel
bar
# >> Method is in scope!!!

另外,请参阅this answer以获得更全面的解释。