0

クラスとモジュールがある場合:

class Foo
end

module WhackyFoo
  def whacky
    puts 'shits whacky!'
  end
end

なぜ私はこれを行うことができます:

include WhackyFoo
Foo.new.whacky
# => shits whacky!

誰かがこの使用法が説明されているRubyドキュメントを説明または指摘できますか?

4

2 に答える 2

4

なぜなら、最上位にモジュールを含めると、それは特別なオブジェクトに含まれるから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)
于 2012-12-07T17:52:14.467 に答える
1

最終include的にはオブジェクトで呼び出されます。これは、ルビーのすべてが要約されるものです。すべてのクラスはObjectを継承するため、モジュールで定義したメソッドは最終的にすべてのクラスに含まれることになります。

于 2012-12-07T17:52:31.020 に答える