2006年6月21日

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で実装されている予感。

Trackback on "Ruby yieldがよくわからない"

このエントリーのトラックバックURL: 

"Ruby yieldがよくわからない"へのトラックバックはまだありません。

Comment on "Ruby yieldがよくわからない"

"Ruby yieldがよくわからない"へのコメントはまだありません。

Post a Comment

コメントする
(書式を変更するような一部のHTMLタグを使うことができます)
ブラウザに投稿者情報を登録しますか?(Cookieを使用します。次回書き込み時に便利です。)
  •  
  •