我在模块中写了一些类:
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...>
如何在模块B中定义方法以在C类中调用?
答案 0 :(得分: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
。继承实例方法的方法只有两种:
class C < super_class
其中super_class
是一个返回类的表达式
包含一个模块:
class C
include <some module>
有关超类链的说明,请参阅How does Inheritance work in Ruby?和Ruby: Module, Mixins and Blocks confusing?
答案 1 :(得分:3)
Ruby中的命名空间不像你想象的那样工作。
没有“命名空间方法”这样的东西。 A::B#foo
是模块 A::B
上的实例方法 - 这是B
命名空间中名为A
的模块}。
命名空间模块/类之间具有 no 特殊的继承关系。它们纯粹是组织性的,除非在它们影响词汇范围时定义了很长的路(例如module A; module B; end; end
)。
如果您想在A::B
中获取A::B::C
的方法,则必须include A::B
A::B::C
,就像您在其他地方一样。你必须这样做是因为,如上所述,命名空间模块/类并没有什么特别之处,它与其他模块/类一样对待。
答案 2 :(得分:2)
class A::B::C
include A::B
end