Аргументы лямбды Ruby

Этот код работы как ожидалось (ничего не делает, даже не производит предупреждение/ошибки):

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)

22
задан andrii 9 February 2010 в 21:41
поделиться

2 ответа

Лямбды такие странные, их поведение отличается, когда у вас меньше двух аргументов. Дополнительную информацию можно найти в этой статье .

14
ответ дан 29 November 2019 в 05:03
поделиться

Этот скрипт научит вас всему, что нужно знать о закрытиях в 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
13
ответ дан 29 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: