2009-11-06 1 views
19

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

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 

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

ответ

10

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

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

+0

не могли бы вы немного объяснить скрипт лямбды? – Geo

+0

ok, когда вы пытаетесь вызвать метод с именем 'blah()' и 'method_missing', он запускает его, чтобы проверить, определен ли лямбда под названием' blah' в соответствующем контексте. Если такая лямбда определена, то она просто вызывает лямбда, используя обычный синтаксис «blah.call», она также проходит по любым параметрам, которые были даны – horseyguy

+0

Я думаю, что это потрясающий взломать. Спасибо. – Geo

6

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

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

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

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

+1

Тот факт, что рубин ООП не объясняет, почему вы не можете использовать '()' для вызова лямбда. Многие языки позволяют вам определять метод '()' для ваших объектов. Вопрос в том, почему Ruby не позволяет вам определить оператор '()'? – horseyguy

+1

(Только что увидел этот комментарий ...) Хороший вопрос. Возможно, это связано с тем, как вы можете пропустить круглые скобки в определенных ситуациях; было бы странно иметь неявный перегруженный операторский вызов. –

 Смежные вопросы

  • Нет связанных вопросов^_^