2

WindowsでRuby1.9.3を使用しています。Kernelそこで、クラスを介してコンソールで使用できるメソッドを追加したいと思います。コンソールを起動します。

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

これを(クラスKernelの一部である)に追加した後Object

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)それとも私は間違っていますか?私は何かが足りないのですか?

4

1 に答える 1

4

はい、この場合、Object直接拡張する必要があります。しかし、もしあなたがそんなに傾いているなら、あなたは拡張することができますKernel、ただそれを再びオブジェクトに含めることを忘れないでください。

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!!!

また、より詳細な説明については、この回答を参照してください。

于 2012-06-14T09:27:13.387 に答える