1

Ruby 1.9を使用して、列挙子の遅延評価を理解しようとしています。これは進行中の作業であるため、おそらく他のバグや不足しているコードがあるでしょうが、現在 1 つの特定の問題があります。私はこのテストに合格しようとしています (テストを変更できないことに注意してください):

def test_enumerating_with_a_single_enumerator
  enumerator = SomeClass.new(some_infinite_sequence.to_enum)
  assert_equal [1, 2, 3, 4, 5], enumerator.take(5)
end

以下にこのコードを書きましたが、問題は、Enumerator クラスのインスタンスである初期化メソッドの引数で SomeClass からlazy_selectインスタンス メソッドを呼び出していることだとわかっているため、NoMethodError が発生します。助言がありますか?ありがとうございました。

class SomeClass < Enumerator

  def initialize(*enumerators)
    super() do |yielder|
      enumerators.each do |enumerator|
        enumerator.lazy_select { |yielder, first_value, second_value| yielder.yield first_value if (first_value <=> second_value) <= 0 }
        .first(20)
      end
    end
  end

  def lazy_select(&block)
    self.class.new do |yielder|
      each_cons(2) do |first_value, second_value|
        block.call(yielder, first_value, second_value)
      end
    end
  end
end
4

2 に答える 2

0

上記のコメントをいただきありがとうございます。彼らはとても役に立ちました。私は次のようにそれを解決することができました:

class SomeClass < Enumerator

  class SomeOtherClass < RuntimeError

    attr_reader :enumerator

    def initialize(enumerator)
      @enumerator = enumerator
    end
  end


  def initialize(*enumerators)
    super() do |yielder|
      values = []
      enumerators.each do |enumerator|
        values.push lazy_select(enumerator) { |value| sorted? enumerator }.take(@number_to_take)
      end
      values.flatten.sort.each { |value| yielder.yield value }
    end
  end

  def lazy_select(enumerator, &block)
    Enumerator.new do |yielder|
      enumerator.each do |value|
        yielder.yield value if block.call enumerator
      end
    end
  end

  def sorted?(enumerator)
    sorted = enumerator.each_cons(2).take(@number_to_take).all? { |value_pair| compare value_pair }
    sorted || raise(SomeClass::SomeOtherClass, enumerator)
  end

  def compare(pair)
    pair.first <= pair.last
  end

  def take(n)
    @number_to_take = n
    super
  end
end

これは私のすべてのテストに合格します。

于 2013-08-09T18:35:06.050 に答える