読者です 読者をやめる 読者になる 読者になる

エンジニア劣等感の克服記

エンジニアでありながら、エンジニアに劣等感を感じている。それを克服していきたい。

array.map(&:method)の挙動

array.map(&:method)の挙動

以下のように書いていると

[1, 2, 3].map { |value| value.to_s }

以下のように書けるぞ、とrubocopなどでよく怒られる。

[1, 2, 3].map(&:to_i)

なぜこう書けるのか今まで理解していなかったが、最近理解したので記述する。

&:method は何をしているのか

&:mehtod をmapの引数に渡していることになるが、では &:methodとは何をしてくれてるのか?

&:method は、:method というシンボルに対してto_procメソッドを呼びProcオブジェクトを作り、 そのProcオブジェクトをブロックとして渡している。

Procオブジェクトとは Proc.new{ |val| val.method } のようオブジェクト。

irb(main):023:0> proc_object = Proc.new{ |val| val.to_i }
=> #<Proc:0x007ff98b986ea8@(irb):23>
irb(main):024:0> proc_object.call "01"
=> 1

こんな感じで、callすると、引数に対してto_iを適用するようなオブジェクトを作れたりする。

まとめると、例えば [1, 2, 3].map(&:to_s) は [1, 2, 3].map(&Proc.new{ |val| val.to_s }) と同じ。シンボルにto_procを呼んでProcオブジェクトを作り、それをブロックとして渡している。

詳しくはパーフェクトrubyを参照すると非常によくわかるかと…。