Этот код работы как ожидалось (ничего не делает, даже не производит предупреждение/ошибки):
l = lambda {|i|}
l.call(1)
Этот код производит предупреждение (предупреждение: несколько значений для параметра блока (0 для 1)):
l = lambda {|i|}
l.call
И этот код перестал работать с ошибкой (ArgumentError: неправильное количество аргументов (0 для 2)):
l = lambda {|i, y|}
l.call
Я думал, что лямбда требует, чтобы весь аргумент был передан.
И от второго примера я вижу, что это не. Почему это работает, когда только один аргумент дан и работает как ожидалось (сбои с ошибкой) больше чем с одним аргументом?
PS: рубиновые 1.8.6 (11.08.2008 уровней установки патча 287) [универсальный-darwin9.0]
ОБНОВЛЕНИЕ: я проверил эти образцы с рубином 1.9.1p376. И это работает как ожидалось - второй пример также производит ошибку. Похож это - функция 1,8 версий (или <=1.8)
Лямбды такие странные, их поведение отличается, когда у вас меньше двух аргументов. Дополнительную информацию можно найти в этой статье .
Этот скрипт научит вас всему, что нужно знать о закрытиях в Ruby.
# So, what's the final verdict on those 7 closure-like entities?
#
# "return" returns from closure
# True closure? or declaring context...? Arity check?
# --------------- ----------------------------- -------------------
# 1. block (called with yield) N declaring no
# 2. block (&b => f(&b) => yield) N declaring no
# 3. block (&b => b.call) Y except return declaring warn on too few
# 4. Proc.new Y except return declaring warn on too few
# 5. proc <<< alias for lambda in 1.8, Proc.new in 1.9 >>>
# 6. lambda Y closure yes, except arity 1
# 7. method Y closure yes