假设我在嵌套模块结构中定义了几个类:
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中有任何导入构造来执行此操作。
如果你只需要用render
方法,那么我同意你的方法。如果您可能在其他地方需要它,那么您可以在类中定义一个常量来为更长的复合名称添加别名,例如:
class Foo
...
COMPONENTS = Core::UI::Components
...
def render
COMPONENTS::ImageView...
...
end
或者,您可以为每个类添加别名:
IMAGE_VIEW = Core::UI::Components::ImageView
...
我在所有大写中定义了这些常量作为读者的提示,这些常量不是当前模块中的类,但您也可以使用驼峰大小写。
如果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