Вы неправильно думаете о лямбде. Лямбда - это приостановка исполняемого кода. Я говорю приостановлено, потому что он готов к запуску, даже готов принять аргументы, но на самом деле он еще ничего не сделал .
Например, рассмотрим следующую (проходящую) спецификацию:
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
Обратите внимание на две вещи:
- Я получил объект из ключевого слова
lambda
. Вы тоже получаете этот объект, но поскольку вы не присваиваете его переменной, он сразу теряется. ;)
- Я использовал метод
call
, чтобы фактически выполнить код в приостановке (то есть в лямбде). В данном примере вы вообще не запускаете задачу git:checkout
!
begin ... rescue ... end
- это совершенно другой механизм: цель состоит в том, чтобы правильно обрабатывать (или, в вашем случае, глотать) исключения. Придерживайтесь этой формы; это единственный, который делает то, что вам нужно. :)