Вам нужно каким-то образом провести различие между вызовом Proc
и передачей его вокруг.
В Python и ECMAScript все просто: с круглыми скобками это вызов, без него нет. В Ruby опускание скобок также вызов, поэтому должен быть какой-то другой способ различения.
В Ruby 1.8 Proc#call
и его псевдоним Proc#[]
служат этому различию. Начиная с Ruby 1.9, obj.(arg)
является синтаксическим сахаром для obj.call(arg)
, а Proc#()
является и псевдонимом для Proc#call
.
Итак, вы можете назвать Proc
вот так:
- foo.call (1, 2, 3)
- foo [1, 2, 3]
- foo. (1, 2, 3)
И вы даже можете определить ()
для своих собственных классов.
Кстати: та же проблема и в том, почему вы должны использовать метод method
, чтобы получить объект метода.