私はモジュール内にいくつかのクラスを書いています:
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のメソッドを定義するにはどうすればよいですか?
それはあなたが書くかのようです:
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つだけです。
class C < super_class
super_class
クラスを返す式は どこにありますか
モジュールを含む:
class C
include <some module>
スーパークラスチェーンの説明については、Rubyで継承がどのように機能するかを参照してください。とRuby:モジュール、ミックスイン、ブロックが混乱していますか?
Rubyの名前空間は、あなたが思っているようには機能しません。
「名前空間メソッド」のようなものはありません。モジュールA::B#foo
のインスタンスメソッドです。これは、の名前空間で名前が付けられたモジュールです。 A::B
B
A
名前空間モジュール/クラスには、それらの間の継承の特別な関係はありません。それらは、語彙スコープに影響を与える可能性がある長い道のり(たとえば)で定義されている場合を除いて、本質的に純粋に組織的です。module A; module B; end; end
inのメソッドを取得する場合は、他の場所と同じように、 A::B
inA::B::C
にする必要があります。上記のように、名前空間化されたモジュール/クラスには特別なことは何もないため、これを行う必要があります。他のモジュール/クラスと同じように扱われます。include A::B
A::B::C
class A::B::C
include A::B
end