2

含まれているモジュールのメソッドが後続のクラス定義に混在しているのはなぜですか (クラスがそれ自体に含まれているかのように)。

module Foo
  def bar
    print "#{self}\n"
  end
end

class Bar
end

begin
  Bar.bar
rescue NoMethodError
  puts "There is no Bar.bar\n"
end

include Foo

bar
Bar.bar
Bar.new.bar

プリント:

Bar.barはありません
主要
バー
#<Bar:0xb73f2048>

これは予想される動作ですか?なんで?

4

2 に答える 2

2

プログラムにFooを含めるが、クラスまたはメソッドの外部にある場合、Fooはmainオブジェクトである現在のスコープに含まれます。

これをテストするには、barメソッドを次のように変更します。

  def bar
    print "InBar class: #{self.class} value: #{self}\n"
  end

そして最後に次の2行を追加します

2.bar
Fixnum.bar

これにより、次の出力が得られます

There is no Bar.bar
InBar class: Object value: main
InBar class: Class value: Bar
InBar class: Bar value: #<Bar:0x21ecec>
InBar class: Fixnum value: 2
InBar class: Class value: Fixnum
于 2010-07-24T16:18:08.423 に答える
2

include最上位のanは、モジュールを にミックスしますObject。混在している限りObject、すべてのインスタンス メソッドとして使用できます。

于 2010-07-24T16:54:20.350 に答える