Подтвердить что ты не робот

Почему не требуется вызов лямбды Ruby 1.9 без точки перед круглыми скобками?

Я проверил последнюю версию Ruby, чтобы немного поиграть с последними изменениями. Первое, что я пытался сделать, это вызвать Ruby lambda/block/proc так же, как если бы вы сделали это с помощью Python.

a = lambda {|x| puts x}
a.call(4) # works, and prints 4
a[4] # works and prints 4
a.(4) # same
a(4) # undefined method 'a' for main:Object

Почему не последний вызов? Будет ли это когда-либо?

4b9b3361

Ответ 1

AFAIK, потому что ruby ​​не позволяет вам определить метод () для объекта. Причина, по которой он не позволяет вам определить метод (), вероятно, связан с тем, что скобки являются необязательными в вызовах методов.

И для чего это стоит, вот взломать, чтобы вы могли использовать lambdas, используя () http://github.com/coderrr/parenthesis_hacks/blob/master/lib/lambda.rb

Ответ 2

Ruby в основном 100% объектно-ориентированный, но иногда он пытается скрыть этот факт для... удобства? Дружественные?

Основные функции, определенные "на верхнем уровне", действительно определяются как методы для глобального объекта. Чтобы выполнить эту работу, вызов без спецификатора действительно преобразуется в вызов метода с этим именем на указанном глобальном объекте. Этот стиль делает вещи более интересными script -y. Ruby пытается сделать это с вашего последнего примера.

Первые два примера прекрасно разбираются, потому что Ruby знает, что вы пытаетесь получить доступ к методам объекта proc - помните, что даже [] - это просто метод, который вы можете определить. Точка с явной точкой также работает, потому что точка означает "отправить это сообщение этому объекту" (в этом случае a).

Я знаю, что ничего не решает, но я надеюсь, что это поможет.