Назад к вопросам
Middle
155
questionbank

Что такое лямбда и процедура в Ruby?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Лямбда и процедура в Ruby — это объекты Proc, инкапсулирующие блок кода.

Основные отличия заключаются в поведении при возврате значений и количестве принимаемых аргументов:

  • Лямбда (Lambda):

    • Строго контролирует количество аргументов (как обычный метод).
    • return внутри лямбды возвращает значение только из нее самой.
    # Пример лямбды
    lambda_proc = lambda { |a, b| return a + b }
    puts lambda_proc.call(1, 2) # 3
    
    # Ошибка: неправильное количество аргументов
    # lambda_proc.call(1)
    
  • Процедура (Proc):

    • Менее строга к количеству аргументов (может не вызвать ошибку, если аргументов больше или меньше ожидаемого).
    • return внутри процедуры возвращает значение из контекста, где процедура была определена (как return в блоке).
    # Пример процедуры
    proc_proc = Proc.new { |a, b| return a + b }
    
    def method_with_proc
      proc_proc = Proc.new { return "возврат из метода" }
      proc_proc.call
      "этот текст не будет показан"
    end
    
    puts method_with_proc # возврат из метода
    
    # Не вызывает ошибку при неправильном количестве аргументов (хотя поведение может быть непредсказуемым)
    # proc_proc.call(1)
    

Сравнение:

Характеристика Лямбда (Lambda) Процедура (Proc)
Контроль аргументов Строгий Нестрогий
Поведение return Возвращает из самой лямбды Возвращает из контекста
Класс Proc (но с флагом lambda?) Proc
Создание lambda { ... }, -> { ... } Proc.new { ... }, proc { ... }

В большинстве случаев для передачи блоков поведения, схожего с методами, предпочтительнее использовать лямбды из-за их более предсказуемого поведения с аргументами и return. Процедуры чаще используются для более низкоуровневых задач или там, где их специфическое поведение return является желательным.