Object#method の奇妙なること(Ruby)

Object#method はメソッドをオブジェクト化してくれるのですよね。だから、こんな奇妙なブロックなしの世界が…。

[1] pry(main)> putout = method(:p)
=> #<Method: Object(Kernel)#p>
[2] pry(main)> a = [1, 5, 4, -2, 10, 3]
=> [1, 5, 4, -2, 10, 3]
[3] pry(main)> a.each(&putout)
1
5
4
-2
10
3
=> [1, 5, 4, -2, 10, 3]
[4] pry(main)> a.each_cons(2, &putout)
[1, 5]
[5, 4]
[4, -2]
[-2, 10]
[10, 3]
=> nil

Kernel.#p もこうしてブロックなしで使えてしまう…。

Rubyトリビアでした。
 

追記

上はこの挙動が元になっています。

[5] pry(main)> putout.call("Tokyo")
"Tokyo"
=> "Tokyo"

例えば a.each(&putout) は、call() が自動的に補われて a.each {|x| putout.call(x)} と同等になります。

なお、よく使われるイデオムである例えば%w(a b c).map(&:upcase) というのは、to_proc.call() が自動的に補われて %w(a b c).map {|x| :upcase.to_proc.call(x)} と同等になります。よく似ていますね。さらにいうと、:upcase.to_proc.call(x) というのは、x.upcase と同等です。うーん、面倒だ。