Когда лямбда-выражение ожидает аргументы, а мы их не предоставляем или неверное количество аргументов выдается, возникает исключение.
l = lambda { |name| puts "Today we will practice #{name} meditation." }
l.call
ArgumentError: wrong number of arguments (given 0, expected 1)
Мы можем использовать метод arity для определения количества ожидаемых аргументов:
l.arity # Output: => 1
Как и методы, лямбда-выражения принимают все следующие типы параметров / аргументов:
- Позиционные параметры (обязательные и необязательные)
- Параметр одиночного знака (*);
- Параметры ключевых слов (обязательные и необязательные);
- Параметр двойного сплата (**);
- Явный параметр блока с префиксом амперсанда (&).
Следующие примеры иллюстрируют синтаксис лямбды, которая принимает аргументы нескольких типов.
# Stabby syntax
l = -> (cushion, meditation="kinhin", *room_items, time:, posture: "kekkafuza", **periods, &p) do
p.call
end
# Regular syntax
l = lambda do |cushion, meditation="kinhin", *room_items, time:, posture: "kekkafuza", **periods, &p|
p.call
end
l.call("zafu", "zazen", "zabuton", "incense", time: 40, period1: "morning", period2: "afternoon" ) { puts "Hello from inside the block, which is now a proc." }
Output:
Hello from inside the block, which is now a proc.
Лямбды обрабатывают аргументы так же, как и методы. В этом посте о методах есть подробное объяснение всех вышеперечисленных типов параметров / аргументов.