0
class Check 
  include TestParser
  # so on
end

およびモジュール構造:

module TestParser
  class Array
    def parse_test
      # method
    end
  end
end

私が達成したいのは、ファイル check.rb 内のすべての配列をparse_testメソッドで呼び出すことができるようにすることです。

どこで間違えた?(未定義のメソッドエラーをスローします)

4

3 に答える 3

4

あなたが探しているのは、Ruby 2.0 の改良点です。この機能は実験的なものであることに注意してください。

module TestParser
  refine Array do
    def parse_test
      42
    end
  end
end

using TestParser  # This applies only to the current file

class Check
  [].parse_test  #=> 42
end

Array から継承してメソッドを追加することもできます。

class TestParser < Array
  def parse_test
    42
  end
end

arr = TestParser.new
arr.is_a? Array  #=> true
arr.parse_test   #=> 42

ただし、これらのいずれかを行うことは強くお勧めしません。Array をカプセル化し、必要なメソッドのみを提供するオブジェクトを作成することをお勧めします。

class TestParser
  def initialize array = []
    @array = array
  end

  def parse_test
    # do stuff to @array
  end
end

最後に、あなたが持っているものが機能しない理由について:

module TestParser
  class Array
    def parse_test; end
  end
end

メソッドを持たないモジュールTestParserとメソッドを 1 つ持つクラスTestParser::Array( parse_test) の 2 つを作成します。にはメソッドがないためTestParser、別のモジュール/クラスに含めても、使用可能なメソッドには影響しません。インクルードTestParserは では何もしませんTestParser::Array

于 2013-09-10T01:17:32.433 に答える
1

メソッドTestParser::Arrayを含む新しいクラスを定義しました。クラスparse_testを変更していません。Array

また、モジュールとインクルードを混同している可能性があります。

Ruby プログラムの配列にメソッドを追加することが目的の場合は、モジュール宣言なしでparse_test、これを というファイルに入れることができます。test_parser.rb

class Array  
  def parse_test
    # method
  end
end

しかしArray、それはあなたがしたくないと言った基本クラスを変更します。さらに、ファイルがdになるとすぐにその変更を行います 。含める必要はありません。require

Ruby 2.0 の現在実験的な機能である改良と呼ばれる機能以外では、この種の変更を基底クラスにローカライズする方法はありません (これは「モンキー パッチ」と呼ばれます)。

配列の動作をコード内でのみ変更したい場合は、Array を拡張する独自のクラスを定義するのが最善の策です (つまり、それをコンテナ クラスにして、通常Arrayの 、または必要に応じてサブクラスに委譲します)。 .

于 2013-09-10T01:15:38.400 に答える