В чем разница между лямбдой и начальным блоком? - PullRequest
4 голосов
/ 27 августа 2010

Я пытаюсь проверить, был ли текст записан в файл (build.log) после выполнения грабли, которая вызовет исключение. Извлеките оба фрагмента кода, приведенных ниже, с началом работы работает, тогда как лямбда выдает сообщение о том, что не может найти файл build.log.

Использование начала тестирования. (Работает)

  begin 
     Rake::Task['git:checkout'].invoke //writes "destination already exists" to build.log
  rescue
  end
  IO.read(@project_folder+@build_id+"/build.log").should match(/.*destination.*already.*exists.* /)   

Попытка проверить то же самое с помощью лямбды. (Не работает)

  lambda {
    Rake::Task['git:checkout'].invoke //writes "destination already exists" to build.log
  }
  IO.read(@project_folder+@build_id+"/build.log").should match(/.*destination.*already.*exists.* /) 

В чем разница между этими двумя?

1 Ответ

5 голосов
/ 27 августа 2010

Вы неправильно думаете о лямбде. Лямбда - это приостановка исполняемого кода. Я говорю приостановлено, потому что он готов к запуску, даже готов принять аргументы, но на самом деле он еще ничего не сделал .

Например, рассмотрим следующую (проходящую) спецификацию:

flag = false
x = lambda {            # Here, we suspend a function to set our flag.
  flag = true
}

flag.should == false    # The code in the lambda is still suspended;
                        # it hasn't done any work.

x.call                  # Now we ran the suspended function.
flag.should == true

Обратите внимание на две вещи:

  1. Я получил объект из ключевого слова lambda. Вы тоже получаете этот объект, но поскольку вы не присваиваете его переменной, он сразу теряется. ;)
  2. Я использовал метод call, чтобы фактически выполнить код в приостановке (то есть в лямбде). В данном примере вы вообще не запускаете задачу git:checkout!

begin ... rescue ... end - это совершенно другой механизм: цель состоит в том, чтобы правильно обрабатывать (или, в вашем случае, глотать) исключения. Придерживайтесь этой формы; это единственный, который делает то, что вам нужно. :)

...