gpt4 book ai didi

ruby - lambda 和 begin block 有什么区别?

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:13 24 4
gpt4 key购买 nike

在执行会抛出异常的 rake 任务后,我正在尝试验证文本是否已写入文件 (build.log)。检查下面的两个代码片段,带有 begin 的代码片段有效,而 lambda 抛出一条消息说找不到 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 进行测试。 (无效)

  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.* /)

这两者有什么区别?

最佳答案

您对 lambda 的理解有误。 lambda 是可运行代码的暂停。我说暂停,因为它已准备好运行,甚至准备好接受争论,但它实际上还没有任何事情。

例如,考虑以下(通过)规范:

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 方法来实际执行暂停中的代码(即在 lambda 中)。在您给出的示例中,您实际上根本没有运行 git:checkout 任务!

begin ... rescue ... end 是一种完全不同的机制:目的是正确处理(或者在您的情况下,吞下)异常。坚持使用这种形式;它是唯一能满足您需求的产品。 :)

关于ruby - lambda 和 begin block 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3579714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com