我想在ruby中创建一个gem,它包含更多的类,而不仅仅是与gem名称相同的类,并调用这些类的方法,如下所述。
我想拥有以下树:
my_handlers
-lib
--my_first_handler.rb
--my_second_handler.rb
在创建和安装gem之后,我想调用像
这样的类的方法MyHandlers::MyFirstHandler.Method1
MyHandlers::MySecondHandler.Method1
是否可以像这样创建一个宝石? (抱歉我的英语不好)
答案 0 :(得分:1)
具有相同名称shell的gem的主命名空间不是类,而是模块,所有类和其他模块shell都嵌套在其中。对于您的情况,它看起来像:
<强> LIB / my_handlers.rb:强>
require 'my_handlers/my_first_handler'
require 'my_handlers/my_second_handler'
<强> LIB / my_handlers / version.rb:强>
module MyHandlers
Version = 0.0.1
end
<强> LIB / my_handlers / my_first_handler.rb:强>
module MyHandlers
module MyFirstHandler
def method
end
end
end
<强> LIB / my_handlers / my_second_handler.rb:强>
module MyHandlers
module MySecondHandler
def method
end
end
end
并按如下方式组织对方法的访问:
MyHandlers::Version # => 0.0.1
MyHandlers::MyFirstHandler.method
MyHandlers::MySecondHandler.method
或使用::include
操作将模块的方法作为其实例方法包含在类中:
class A
include MyHandlers::MyFirstHandler
end
A.new.method
或使用::extend
操作使用模块的方法扩展类作为classe的单例方法:
class A
extend MyHandlers::MyFirstHandler
end
A.method