我正在创建一个为String
类添加新方法的gem。例如,如果我创建了一个在to_foobar
上添加String
的方法,我知道我可以这样做:
class String
def to_foobar
# ...
end
end
但这是正确的方法还是有更好的方法?
答案 0 :(得分:5)
我更喜欢
# my_gem/lib/my_gem/core_extensions/string.rb
module MyGem::CoreExtensions::String
def to_foobar
# ...
end
end
class String
include MyGem::CoreExtensions::String
end
这样,如果我得到一个提及String#to_foobar
的错误消息,我不必怀疑“等待,String
没有to_foobar
方法,其中来自哪里?“我可以说
String.ancestors
# => [String, MyGem::CoreExtensions::String, Comparable, Object, Kernel]
Etvoilà,在祖先链中存在这个可疑的模块,遵循标准的Ruby命名约定,可能存在于my_gem/lib/my_gem/core_extensions/string.rb
。
或者,我可以说
''.method(:to_foobar).owner
# => MyGem::CoreExtensions::String
实际上得到了一个有意义的答案。
当然,
''.method(:to_foobar).source_location
# => ['my_gem-0.0.1/lib/my_gem/core_extensions/string.rb", 4]
始终有效。
答案 1 :(得分:0)
是的,这完全没问题。如果您不知道如何从头开始构建宝石,我建议您查看jeweler。