例えば true/false の配列をビット列に変換したいとして、こうしたかった。
cond = [true, false, false, true, false, true] cond.inject(0).with_index {|(acc, c), i| c ? acc | 1 << i : acc} #=>TypeError (0 is not a symbol nor a string)
inject
はブロックを取らない場合、Enumerator を返さないのですね。
仕方がないのでenum_for
を使う。
cond.enum_for(:inject, 0).with_index {|(acc, c), i| c ? acc | 1 << i : acc} #=>0b101001
これでinject
も Enumerator を返します。
しかし、enum_for
ってどうなっているのだろうね。どうも、ブロックを取るメソッドはすべて使えるらしい。変な例。
class String def upcase🍓 yield(upcase) end end enum = "aaa".enum_for(:upcase🍓) enum.map {|e| e + "0"} #=>["AAA0"]
謎である。