假设我在嵌套模块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标准?怎么会以红宝石的方式写出来?
感谢,
答案 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
由于ImageView
和TextView
是模块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