Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中对命名空间类调用namespace方法_Ruby_Oop_Class_Module - Fatal编程技术网

如何在Ruby中对命名空间类调用namespace方法

如何在Ruby中对命名空间类调用namespace方法,ruby,oop,class,module,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...> 模块A 结束 模块A::B 德福 打印“foo” 结束 结束 类别A::B::C 结束 A::B::C.new.foo#=>NoMeth

我正在模块内编写一些类:

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...>
模块A
结束
模块A::B
德福
打印“foo”
结束
结束
类别A::B::C
结束
A::B::C.new.foo#=>NoMethodError:#

我如何定义模块B中的方法来调用类C?

Ruby中的名称空间并不像您想象的那样工作

class A::B::C
  include A::B
end
  • 没有所谓的“名称空间方法”
    A::B#foo
    是模块
    A::B
    上的一个实例方法,该模块在
    A
    的命名空间中名为
    B

  • 名称空间模块/类之间没有特殊的继承关系。它们在本质上纯粹是组织性的,除非定义得很长(例如模块A;模块B;end;end),因为它们会影响词汇范围

  • 如果您想在
    A::B::C
    中获取
    A::B
    的方法,必须像在其他任何地方一样
    A::B::C
    中包含A::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
    。只有两种方法可以继承实例方法:

  • class C
    其中
    super\u class
    是返回类的表达式

  • 包括一个模块:

    class C
      include <some module>
    
    C类
    包括
    

  • 有关超类链的说明,请参见和

    谢谢。但在A::B::C中是否有不使用include A::B的解决方案?我认为没有其他方法。您是否有理由避免使用
    include