2010-08-26 2 views
4

Я пытаюсь проверить, был ли текст записан в файл (build.log) после выполнения команды rake, которая выдает исключение. Осмотрите оба фрагмента кода ниже, тот, который начинается с работы, тогда как lambda выбрасывает сообщение о том, что он не может найти файл build.log.В чем разница между лямбдой и началом блока?

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

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

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

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

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

ответ

5

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

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

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 - совершенно другой механизм: целью является правильная обработка (или в вашем случае, проглатывание) исключений. Придерживайтесь этой формы; это единственный, кто делает то, что вам нужно. :)

+0

Большое спасибо. Ваш ответ прояснил мое замешательство. – Muthu