今日も今日とて,lambda
今日も再帰の練習というか,結局昨日や一昨日と同じような事ですけど.
もう一度,each
昨日,どうみても手続き型っぽくて,拡張性の低いeachまがいを書いてしまい,なんだか許せなかったのでもう一度挑戦です.
class Array def my_each(&b) i = 0 while i < self.size b.call(self[i]) i += 1 end end end a = [1,2,3,4,5] a.my_each{|e| print "#{e} " } puts $ ruby lambda_test4.rb 1 2 3 4 5
最初,yeildを使ったりするのかな?とか思いましたが,普通にブロックをcallすればできました.しかし,whileはかっこわるいなぁ.
whileをなくす
ココは折角なので,lambdaを使ってwhileを消しちゃって再帰しちゃうぞ.
class Array def my_each2(&b) each = lambda{|i| b.call(self[i]) i += 1 each.call(i) if i < self.size } each.call(0) end end
なんとかwhileは消せた.気分的にはスッキリだけど,iはどうにもならないのかな.もちろん,lambdaをProc.new,procに置き換えても動きますよ.
渡したブロックの処理で配列の大きさが変わっても,問題無く繰り返しが行えるのかな.所詮遊びですので,バグ取りとかは勘弁.
実際のeachの処理がどのように行われているのだろう.知りたくても,どのようにググったら良いのか分からないのでした.なんというか,再帰って結構楽しい.もっと高度な再帰を学ぶぞ.