2012-06-10 49 views
2

我正在創建一個向String類添加新方法的gem。舉例來說,如果我是創建加在Stringto_foobar的方法,我知道我可以簡單地做:創建一個將方法添加到核心類的Gem

class String 
    def to_foobar 
    # ... 
    end 
end 

但是,這是要做到這一點正確的方式還是有更好的辦法?

+0

看起來對我來說,另一種選擇是把代碼放在一個模塊中,然後只對特定用例擴展字符串 – house9

回答

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] 

的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] 

始終有效。

+0

謝謝你的出色答案。我得到了我的答案,並學習了一些有用的方法:) –

0

是的,這很好。如果你不知道如何從頭開始創建一個寶石,我建議你看看jeweler

相關問題