Ruby yieldがよくわからない

C言語の関数ポインタの逆みたいなもんすかね。処理構造は定義するけど、具体的な処理は、呼び出し側が定義できる、と。
Rubyリファレンスマニュアルに載っているコードを一通りに入力し、以下のサンプルを作ってみた。
渡された配列の各要素をひとつ飛ばしでループする。

def skipping(arr)
idx = 0
while idx < arr.size
yield(arr[idx])
idx += 2
end
end
skipping([1, 2, 3, 4, 5]) do |num|
p num
end # => 1, 3, 5

今、ブームの素数表示。

def priming(arr)
for num in arr
next if num <= 1
isPrime = true
2.upto(num) { |i| isPrime = false if num % i == 0 && num != i }
if isPrime == true then
yield num
end
end
end
primes = []
priming((1..100).to_a) {|prime| primes << prime}
p primes # => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

配列に対しての処理には便利そう。「条件を満たす要素だけ抜き出す」「並び替え」など。標準機能となっているわけですが・・・(苦笑) これらのリッチな処理はyieldで実装されている予感。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする