命名空间导入的ruby标准

时间:2017-12-21 14:31:42

标签: ruby

假设我在嵌套模块stracture中定义了几个类:

Core::UI::Components::TextView
Core::UI::Components::ImageView
Core::UI::Components::Checkbox

现在我有一个想要使用这个课程的课程,假设这个课程不在' Core'模块。

class XView
  def render
    Core::UI::Components::ImageView.new('x').render
    Core::UI::Components::TextView.new('x').render
  end
end

我想避免写所有模块名称,所以我将其重构为

class XView
  def render
    ui = Core::UI::Components
    ui::ImageView.new('x').render
    ui::TextView.new('x').render
  end
end

模块/类的静态导入是否有ruby标准?怎么会以红宝石的方式写出来?

感谢,

2 个答案:

答案 0 :(得分:2)

我不认为Ruby中有任何导入构造可以做到这一点。

如果您只需要render方法,那么我同意您的做法。如果您可能在其他地方需要它,那么您可以在类中定义一个常量来为更长的复合名称添加别名,例如:

class Foo
...
COMPONENTS = Core::UI::Components
...
def render
  COMPONENTS::ImageView...
  ...
end

或者,您可以为每个类添加别名:

IMAGE_VIEW = Core::UI::Components::ImageView
...

我在所有大写中定义了这些常量作为读者的提示,这些常量不是当前模块中的类,但您也可以使用驼峰大小写。

答案 1 :(得分:1)

如果Core::UI::Components仅用于命名空间,则不包含任何方法声明。您可以通过专为“混合”设计的Module#include提供对这些课程的访问,例如

class XView
  include Core::UI::Components
  def render
    ImageView.new('x').render
    TextView.new('x').render
  end
end

由于ImageViewTextView是模块Core::UI::Components内的类,包括XView中的此模块,因此可以通过在当前“包含”它们来直接访问这些类命名空间似乎是您正在寻找的。显然,这可以在任何级别完成,例如

class XView
  include Core::UI
  def render
    Components::ImageView.new('x').render
    Components::TextView.new('x').render
  end
end
如果您需要访问Core::UI命名空间中包含的其他模块或类,

也可以工作。

否则你可以为此创建第一类DSL,例如

module Core
  module DSL
    def text_view(*args)  
      UI::Components::TextView.new(*args)
    end 
    def image_view(*args)
      UI::Components::ImageView.new(*args)
    end
  end
  extend DSL
end

然后XView看起来像

class XView
  def render
    Core.image_view('x').render
    Core.text_view('x').render
  end
end