Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

「&:」とは結局何なのか調べてみた(その2)

to_proc -> Proc
self に対応する Proc オブジェクトを返します。

生成される Proc オブジェクトを呼びだす(Proc#call)と、 その第一引数の self という名前のメソッドを 残りの引数を渡して呼びだされます。

サンプルではこんな事になってます。

:to_i.to_proc["ff", 16]  # => 255
(1..3).collect(&:to_s)  #=> ["1", "2", "3"]
(1..3).inject(&:+)      #=> 6

自分でも試してみると

> :upcase.to_proc["s"]
=> "S"

第一引数に対象オブジェクト
第二引数以降にメソッドの引数
という感じですかね。

ところが実行に引数をつけるメソッドの場合、
次の例のように、横着してto_procに似せてオブジェクト渡してもダメです。

> (65..70).map(&:+[2])
=> #<Enumerator: 65..70:map>

なので以前書いた記事で扱ったように、each_with_objectと組み合わせれば良いです。

> (65..70).each_with_object(2).map(&:+)
#=> [67, 68, 69, 70, 71, 72]

ただまぁ、冗長ですよね。
aliasとかで糖衣してしまうのも手ですけど。

一応、この問題に関しては
コチラの記事にあるgemが選択肢としてあるみたいです。