hakeの日記

Windows環境でプログラミングの勉強をしています。

yield

rubyの勉強
本で説明をみると良くわからなかったけれども、実際にプログラムを書いてみると解ったような気がする。様はブロックを接続して使用するメソッドの定義でyieldの引数が、ブロック内の||で囲んだ変数に渡されるということなんだろうな。
yieldの引数は、||内の変数の数と対応させる必要があって、メソッド内で実行されたyieldの数だけブロックに値が渡されるということ。

class Test
  def initialize
    @ary = [ 0, 1, 2, 3, 4, 5, 6, 7, 8]
  end
  def one_two
    yield 1
    yield 2
  end
  def each
    @ary.length.times do |i|
      yield @ary[i]
    end
  end
  def each_even
    @ary.length.times do |i|
      yield @ary[i] if (i % 2) == 0
    end
  end
  def each_reverse
    (@ary.length - 1).downto(0) do |i|
      yield @ary[i]
    end
  end
  def each2
    i = 0
    while i < @ary.length
      yield @ary[i],@ary[i + 1]
      i += 2
    end
  end
end

test = Test.new
test.one_two{|i| print i.to_s}      #=> 12
test.each{|i| print i.to_s}         #=> 012345678
test.each_even{|i| print i.to_s}    #=> 02468
test.each_reverse{|i| print i.to_s} #=> 876543210
test.each2{|x,y| print "#{x.to_s}#{y.to_s} "}  #=> 01 23 45 67 8