如何在Ruby中调用命名空间类的名称空间方法

时间:2013-01-24 12:22:20

标签: ruby oop class module

我在模块中写了一些类:

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类中调用?

3 个答案:

答案 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。继承实例方法的方法只有两种:

  1. class C < super_class其中super_class是一个返回类的表达式

  2. 包含一个模块:

    class C
      include <some module>
    
  3. 有关超类链的说明,请参阅How does Inheritance work in Ruby?Ruby: Module, Mixins and Blocks confusing?

答案 1 :(得分:3)

Ruby中的命名空间不像你想象的那样工作。

  1. 没有“命名空间方法”这样的东西。 A::B#foo模块 A::B上的实例方法 - 这是B命名空间中名为A的模块}。

  2. 命名空间模块/类之间具有 no 特殊的继承关系。它们纯粹是组织性的,除非在它们影响词汇范围时定义了很长的路(例如module A; module B; end; end)。

  3. 如果您想在A::B中获取A::B::C的方法,则必须include A::B A::B::C,就像您在其他地方一样。你必须这样做是因为,如上所述,命名空间模块/类并没有什么特别之处,它与其他模块/类一样对待。

答案 2 :(得分:2)

class A::B::C
  include A::B
end