2

私はモジュール内にいくつかのクラスを書いています:

module A
end

module A::B
  def foo
    print "foo"
  end
end

class A::B::C
end

A::B::C.new.foo # => NoMethodError: undefined method `foo' for #<A::B::C...>

クラスCで呼び出すモジュールBのメソッドを定義するにはどうすればよいですか?

4

3 に答える 3

4

それはあなたが書くかのようです:

module A::B
  def foo
    print "foo"
  end

  class C
  end
  print 'C.instance_methods : '; p C.instance_methods(false)
  #=> C.instance_methods : []
end

Cを自動的に継承しませんfoo。インスタンスメソッドを継承する方法は2つだけです。

  1. class C < super_classsuper_classクラスを返す式は どこにありますか

  2. モジュールを含む:

    class C
      include <some module>
    

スーパークラスチェーンの説明については、Rubyで継承がどのように機能するかを参照してください。Ruby:モジュール、ミックスイン、ブロックが混乱していますか?

于 2013-01-24T14:12:04.333 に答える
3

Rubyの名前空間は、あなたが思っているようには機能しません。

  1. 「名前空間メソッド」のようなものはありません。モジュールA::B#fooインスタンスメソッドです。これは、の名前空間で名前が付けられたモジュールです。 A::BBA

  2. 名前空間モジュール/クラスには、それらの間の継承の特別な関係はありません。それらは、語彙スコープに影響を与える可能性がある長い道のり(たとえば)で定義されている場合を除いて、本質的に純粋に組織的です。module A; module B; end; end

inのメソッドを取得する場合は、他の場所と同じように、 A::BinA::B::Cにする必要があります。上記のように、名前空間化されたモジュール/クラスには特別なことは何もないため、これを行う必要があります。他のモジュール/クラスと同じように扱われます。include A::BA::B::C

于 2013-01-24T12:55:17.103 に答える
2
class A::B::C
  include A::B
end
于 2013-01-24T12:24:12.243 に答える