Array.map関数

やっぱRubyは楽しいっすよ.なんかRubyで書きたいな,と思ったので,Array.map関数を自作自作.


とりあえず簡単な所から.

class Array
  def mymap1(&b)
    mapped = []
    self.each{|e|
      mapped << b[e]
    }
    mapped
  end
end

このb[e]って記法,素敵ですよね.怪しい感じが何とも.


次ぃ.もしこの世からeachメソッドが無くなったときのために.

class Array
  def mymap2(&b)
    mapper = lambda{ |xs,mapped|
      return mapped if xs.empty?
      
      xss = xs.dup
      mapped << b[xss.shift]
      mapper[xss,mapped]
    }
    mapped = mapper[self,[]]
  end
end

実行してみる.

> a = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
> a.map{|e| e**2}
=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
> a.mymap1{|e| e**2}
=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
> a.mymap2{|e| e**2}
=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

単純だからか(?)他のアルゴリズムが浮かばねーや.しかし,.call()を[]に書き換えると,やっぱり違和感があるな.