今日はEnumerableを見ていきます。
ちょっと分かりにくいかもしれませんが、自分用の配列MyArrayを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
class MyArray include Enumerable def initialize @arr_a = [] @arr_b = [] @arr_c = [] end def set_value(a, b, c) @arr_a << a @arr_b << b @arr_c << c end def each max = max_size i = 0 while i < max yield [@arr_a[i], @arr_b[i], @arr_c[i]] i += 1 end end def max_size [@arr_a.size, @arr_b.size, @arr_c.size].max end end |
配列3つ持っているだけですね。
※本来は多重配列にすれば済む話ですが、Enumerableをincludeした時の動作を確認したかったので、お許しください。
使ってみましょう。
まず、MyArrayのインスタンスを生成してデータを代入します。
1 2 3 4 5 6 7 8 9 |
my_arr = MyArray.new 5.times do |i| my_arr.set_value(i, i * 2, i * 3) end # 以下のような中身となる # @arr_a : [0, 1, 2, 3, 4] # @arr_b : [0, 2, 4, 6, 8] # @arr_c : [0, 3, 6, 9, 12] |
自分で定義したeachメソッドを使ってみましょう。
1 2 3 |
my_arr.each do |arr| puts (arr[0] + arr[1] + arr[2]).to_s end |
出力は以下の通り、正しいですね。
1 2 3 4 5 6 |
-> % ruby temp.rb 0 6 12 18 24 |
ここからがEnumerableをincludeすることで受けられる恩恵です。
mapメソッドを使ってみましょう。
1 2 3 4 5 |
res_arr = my_arr.map do |arr| arr[0] + arr[1] + arr[2] end p res_arr |
実行結果、
1 2 |
-> % ruby temp.rb [0, 6, 12, 18, 24] |
eachを定義するだけで、色んなメソッドが使えるようになります。
これ初めて知った時は感動したなあ。
ではまた!