今日も今日とて,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の処理がどのように行われているのだろう.知りたくても,どのようにググったら良いのか分からないのでした.なんというか,再帰って結構楽しい.もっと高度な再帰を学ぶぞ.