Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

「&:」とは結局何なのか調べてみた(その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が選択肢としてあるみたいです。