今日はwhile文とブロックを使ってeachメソッドを作ってみました。
1.作ろうと作ろうと思った理由
最近ブロックについて勉強していたのですが、いまいち理解出来なかったので普段使っているものを自分で作ってみようと思ったのが理由です。
2.前提
今回はあくまでブロックを理解するのが目的なので完全なeachメソッドの実装は目指しておりませんのでご了承ください。
3.そもそもeachメソッドって何?
eachメソッドは、配列の要素の数だけブロックを繰り返し実行します。繰り返しごとにブロック引数には各要素が順に入ります。戻り値はレシーバ自身です。
要素を一個ずつ取り出してそれぞれに処理をしていくといった感じですね。
eachメソッドの概要も知れたので早速実装していきたいと思います。
4. 実装
先ほども確認した通り、eachメソッドには二つの処理があるように思われます。
1.要素を順番に取り出す。
2.取り出した要素に対して処理を施す。
1は簡単ですね。
今回はwhileを使います。
class Array
def initialize
@loop_count = 0
end
def alias_each
#要素を順番に取り出す
while @loop_count < self.size
self[@loop_count]
#取り出した要素に対して処理を行う
#なんらかの処理
#ループカウントを一つ増やす
@loop_count += 1
end
end
end
このようになります。
ループさせて要素を取り出していきます。
uptoメソッドなどを使えばループカウンタを使わずに実装できるのですがuptoを使うともうほぼ完成になってしまうと思ったので今回はwhile文でやります笑
続いて取り出した要素にどうやって処理をしていくかですが、ここでyieldを使いたいと思います。
完成したのはこちらです。
class Array
def initialize
@loop_count = 0
end
def alias_each
while @loop_count < self.size
value = yield self[@loop_count]
@loop_count += 1
end
end
end
このようになりました!
早速使ってみたいと思います。
メソッド呼び出し
array = Array.new.push(1,2,3,4,5)
array.alias_each do |value|
p value * 2
end
array = Array.new.push('john', 'bob', 'michal')
array.alias_each do |value|
p value.upcase
end
実行結果
nebashimiyakotasukunoMacBook-ea:original_code keisuke713$ ruby ./array/array.rb
2
4
6
8
10
"JOHN"
"BOB"
"MICHAL"
尚、今回はinitializeメソッドでloop_countを初期化する作業をするためArray.newで作られた配列でないとこのメソッドは使えません。
5.まとめ
今回の実装を通じてeachメソッドの処理の流れ、yieldの使い方を学ぶことができました。
裏でどのようなことが起きているかを知ることは初学者にとっては必要なことだと思うので今後もやっていきたいと思います。