命名空间导入的ruby标准

问题描述 投票:0回答:2

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

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标准?怎么会以红宝石的方式写出来?

谢谢,

ruby
2个回答
2
投票

我不认为Ruby中有任何导入构造来执行此操作。

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

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

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

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

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


1
投票

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

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

由于ImageViewTextViewCore::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
© www.soinside.com 2019 - 2024. All rights reserved.