4

RubyでStringクラスにカスタムメソッドを追加したい。次のコードで実行できることを認識しています。

class String
  def my_own_method
    # impelementation comes here 
  end
end

そのコードを「string.rb」というファイルと別の場所、つまりirbに書くrequire "string"と、非常にうまく機能し、任意の文字列オブジェクトでそのカスタムメソッドにアクセスできます。ただし、カスタム コードを次のようなモジュールにパッケージ化したい場合に問題が発生します。

module A
  class String
    def my_own_method
      # implementation
    end
  end
end

次に、モジュールを (エラーなしで) インクルードすると、たとえばs = A::String.new. その場合、カスタムメソッドにアクセスできますが、文字列オブジェクトではなくs変数に対してのみアクセスできます。util クラスをパッケージ化し、それらのメソッドを基本クラスに自動的に追加するにはどうすればよいですか? どんな助けでも本当に感謝しています。

4

2 に答える 2

7

1 つのオプションは::、最上位の String クラスを取得していることを確認するために使用することです。

module A
  class ::String
    def my_own_method
      self.reverse
    end
  end
end

"some string".my_own_method # => "gnirts emos"

また、彼の回答の最後にあるセルジオのポイントにも同意する必要があります。これを行う必要があるかどうかはよくわかりません。

于 2013-02-13T18:20:27.067 に答える
2

まあ、一つには、あなたが使うことができますclass_eval

module A
  String.class_eval do
    def my_own_method
      self.upcase
    end
  end
end


'foo'.my_own_method # => "FOO"

しかし、私があなただったらString、グローバル スコープでクラスを開きます (最初のスニペット)。やらない理由がよくわかりません。

于 2013-02-13T18:10:58.647 に答える