2

Stringクラスに新しいメソッドを追加するgemを作成しています。たとえば、を追加するメソッドを作成していた場合、to_foobar次のStringことが簡単にできることがわかります。

class String
  def to_foobar
    # ...
  end
end

しかし、これはこれを行う正しい方法ですか、それともより良い方法がありますか?

4

2 に答える 2

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]

ほら、祖先チェーンにこの疑わしいモジュールがあります。これは、標準の 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]

常に動作します。

于 2012-06-11T00:17:14.490 に答える
0

はい、まったく問題ありません。ジェムをゼロから作成する方法がわからない場合は、jeweler を参照することをお勧めします

于 2012-06-10T22:58:19.487 に答える