読者です 読者をやめる 読者になる 読者になる

Ruby で外部イテレータを使う

ソートされた2つの配列を、ソートされた配列としてマージ(結合)します。

class Array
  def sorted_merge(ar)
    (self + ar).sort
  end
end

というのは(むりやりなので)なしです。

class Enumerator
  def next_be?
    begin
      peek
    rescue StopIteration
      return false
    end
    true
  end
end

class Array
  def sorted_merge(ar)
    merged = []
    enum1 = self.to_enum
    enum2 =   ar.to_enum
    
    while enum1.next_be? and enum2.next_be?
      if enum1.peek < enum2.peek
        merged << enum1.next
      else
        merged << enum2.next
      end
    end
    
    merged << enum1.next while enum1.next_be?
    merged << enum2.next while enum2.next_be?
    merged
  end
end

if __FILE__ == $0
  p [1, 5, 9, 10, 15].sorted_merge([2, 4, 8, 30])    #=>[1, 2, 4, 5, 8, 9, 10, 15, 30]
end

Enumerator#next_be? は仕方なく作りました。次の要素が存在するかどうかを判定するメソッドがないのは、Ruby にしては片手落ちのような気がします。

※参考:
Rubyによるデザインパターン』p.119