クラスとモジュールがある場合:
class Foo
end
module WhackyFoo
def whacky
puts 'shits whacky!'
end
end
なぜ私はこれを行うことができます:
include WhackyFoo
Foo.new.whacky
# => shits whacky!
誰かがこの使用法が説明されているRubyドキュメントを説明または指摘できますか?
なぜなら、最上位にモジュールを含めると、それは特別なオブジェクトに含まれるからmain
です。main
(モジュールから含まれるものを含む)で定義されたすべてのメソッドは、 Object
(したがって、すべてのオブジェクト)のプライベートインスタンスメソッドになります。それが機能する理由です。
モジュールを「通常の」クラス(トップレベルではないmain
)に含めると、期待どおりに動作します
module WhackyFoo
def whacky
puts 'shits whacky!'
end
end
class Foo
end
class Bar
include WhackyFoo
end
Bar.new.whacky # >> "shits whacky!"
Foo.new.whacky # ~> -:16:in `<main>': undefined method `whacky' for #<Foo:0x007fa92984d968> (NoMethodError)
最終include
的にはオブジェクトで呼び出されます。これは、ルビーのすべてが要約されるものです。すべてのクラスはObjectを継承するため、モジュールで定義したメソッドは最終的にすべてのクラスに含まれることになります。