やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

組込ライブラリ(Enumerator::Yielder)

 イテレータの引数。

成果物

情報源

Enumerator::Yielder

Enumerator.new で使われるクラスで、直接使うものではありません。

インスタンスメソッド

<< to_proc yield

<<

Enumerator.new で使うメソッドです。

生成された Enumerator オブジェクトの each メソッドを呼ぶと Enumerator::Yielder オブジェクトが渡されたブロックが実行され、ブロック内の << が呼ばれるたびに each に渡されたブロックが << に渡された値とともに繰り返されます。

enum = Enumerator.new do |y|
  y << 1
  y << 2
  y << 3
end

enum.each do |v|
  p v
end
# => 1
#    2
#    3

 一個ずつしか入れられないだと?! 面倒くさい……。

to_proc

Enumerator.new で使うメソッドです。

引数を Enumerator::Yielder#yield に渡す Proc を返します。これは Enumerator::Yielder オブジェクトを他のメソッドにブロック引数として直接渡すために使えます。

text = <<-END
Hello
こんにちは
END

enum = Enumerator.new do |y|
  text.each_line(&y)
end

enum.each do |line|
  p line
end
# => "Hello\n"
#    "こんにちは\n"

yield

Enumerator.new で使うメソッドです。

生成された Enumerator オブジェクトの each メソッドを呼ぶと Enumerator::Yielder オブジェクトが渡されたブロックが実行され、ブロック内の yield メソッドが呼ばれるたびに each に渡されたブロックが yield メソッドに渡された値とともに繰り返されます。

enum = Enumerator.new do |y|
  y.yield 1, 2, 3
end

enum.each do |x, y, z|
  p [x, y, z]
end
# => [1, 2, 3]

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux