我正在创建一个 gem,它向 String
类添加一个新方法。例如,如果我正在创建一个在 String
上添加 to_foobar
的方法,我知道我可以简单地执行以下操作:
class String
def to_foobar
# ...
end
end
但是这是正确的方法还是有更好的方法?
最佳答案
我更愿意
# 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]
瞧,祖先链中有这个看起来可疑的模块,按照标准 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]
始终有效。
关于ruby - 创建一个 Gem,向核心类添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10972198/