String
クラスに新しいメソッドを追加するgemを作成しています。たとえば、を追加するメソッドを作成していた場合、to_foobar
次のString
ことが簡単にできることがわかります。
class String
def to_foobar
# ...
end
end
しかし、これはこれを行う正しい方法ですか、それともより良い方法がありますか?
String
クラスに新しいメソッドを追加するgemを作成しています。たとえば、を追加するメソッドを作成していた場合、to_foobar
次のString
ことが簡単にできることがわかります。
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]
常に動作します。
はい、まったく問題ありません。ジェムをゼロから作成する方法がわからない場合は、jeweler を参照することをお勧めします。