我正在創建一個向String
類添加新方法的gem。舉例來說,如果我是創建加在String
的to_foobar
的方法,我知道我可以簡單地做:創建一個將方法添加到核心類的Gem
class String
def to_foobar
# ...
end
end
但是,這是要做到這一點正確的方式還是有更好的辦法?
我正在創建一個向String
類添加新方法的gem。舉例來說,如果我是創建加在String
的to_foobar
的方法,我知道我可以簡單地做:創建一個將方法添加到核心類的Gem
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]
的Et瞧,有一個在祖先鏈,其中,以下標準的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]
始終有效。
謝謝你的出色答案。我得到了我的答案,並學習了一些有用的方法:) –
是的,這很好。如果你不知道如何從頭開始創建一個寶石,我建議你看看jeweler。
看起來對我來說,另一種選擇是把代碼放在一個模塊中,然後只對特定用例擴展字符串 – house9