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 もこうしてブロックなしで使えてしまう…。
追記
上はこの挙動が元になっています。
[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
と同等です。うーん、面倒だ。