Ruby使用来自" namespace"

时间:2016-10-30 19:21:30

标签: ruby namespaces rubygems

我使用Ruby创建一些简单的项目,我遵循RubyGems项目结构。在我的代码库中,我有两个不同的"命名空间":

的类
lib
  u
    x
      class_a.rb
  m
    p
      class_b.rb

我正在为这个类使用嵌套模块,因此ClassA位于模块U中,位于模块U中。

虽然在ClassA内需要ClassB,但我可以通过U::X::ClassA引用它来使用它。我想知道是否有任何模式可以让我只输入ClassA,而没有完整的命名空间。

2 个答案:

答案 0 :(得分:1)

您可以执行类似

的操作
module M::P
  ClassA = U::X::ClassA 
end

ClassA定义为P内的常量。这不是一个好习惯,但你可以做到。

IMO,只需使用U::X::ClassA

答案 1 :(得分:0)

提前两条评论:

  • 我同意Fede,IMO,只使用U :: X :: ClassA。
  • ruby​​中的命名空间独立于文件结构。所以你的例子可以解释你想要什么,但它没有提供代码示例。

那就是说,你可以建立一个像这样的最小例子:

module U
  module X
    class Class_a
    end
  end
end
module M
  module P
    class Class_b
      include U::X
      def initialize
        a = U::X::Class_a.new ##you want replace this with:
        #a= Class_a.new
      end
    end
  end
end

M::P::Class_b.new
带有Class_a = U::X::Class_a

Fedes solution看起来像:

module U
  module X
    class Class_a
    end
  end
end
module M
  module P
    Class_a = U::X::Class_a ##<- define here the local version
    class Class_b
      def initialize
        a= Class_a.new
      end
    end
  end
end

M::P::Class_b.new

另一种可能性是包含包含类的模块:

module U
  module X
    class Class_a
    end
  end
end
module M
  module P
    class Class_b
      include U::X  #<- Include the module
      def initialize
        a= Class_a.new
      end
    end
  end
end

M::P::Class_b.new

注意:此解决方案将包含模块U::X的所有类和常量。这可能是您需要的解决方案,但也可能是您的目的。