志茂吉建氏のRubyコラム『Ruby 2.0(その1)』
Rails技術者認定試験運営委員会の吉政でございます。
私が企画したコラムの件です。Rails技術者認定試験運営委員会のオーナーでもあるヒューマンリソシアが志茂吉建氏のRubyコラム『Ruby 2.0(その1)』を公開しています。
今回はちょうど一年前になるRuby2.0のお話です。
(このコラムはバックナンバー公開です)
興味がある方はご参考ください。
###
Ruby 2.0がRuby生誕20周年にあたる2013年2月24日にリリースされました。Ruby 2.0ではどのような機能が追加されたか、美学の観点で見ていきたいと思います。
主な変更点は、以下のURLを確認してください。
http://www.ruby-lang.org/ja/news/2013/02/24/ruby-2-0-0-p0-is-released/
この連載で注目すべきは、Enumerable#lazyではないかと考えています。「無限の遅延ストリーム」とリリース情報には記載されていま す。 Enumerable#lazyとは何か少し見ていきたいと思います。配列を扱う部分でmapメソッドやselectメソッドなどを説明させていただきま したが、lazyはこれらと組み合わせて利用することができます。正確には、配列ではなく、Enumerable(列挙型)での処理となります。
例題として、1から100までの3倍数を列挙するプログラムを作成したいと思います。ただし、表示するのは最初の5つまでとします。
リスト1
pp (1..100).select{|num| print num.to_s+” “;num % 3 == 0}.first(5)
リスト1の実行結果
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 5
7 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
[3, 6, 9, 12, 15]
表示するのは最初の5個だけでいいのですが、実際には1から100まですべて評価して計算しているのがわかります。5個の数字を評価すれば処理を終 われば、 あとは評価する必要はありません。でも、このプログラムであればすべて評価しています。では、効率的にするにはどのようなプログラム方法があるでしょう か。
リスト2
nums = Array.new
num=1
while nums.size < 5
if (num % 3) ==0 then
nums.push(num)
end
print num.to_s+” “
num = num + 1
end
リスト2の結果
リスト2は配列が5個以上になれば終了するようにプログラムを作成しています。first(5)という評価をwhile文で代用しているのです。リスト2のプログラムをlazyメソッドを利用して作成すると一行で済みます
(この続きは以下のコラム本文をご覧ください)
http://resocia.jp/column/356/