gpt4 book ai didi

ruby - 当你有一个没有参数的 case 语句并且 when 子句是 lambda 时会发生什么?

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

这段代码没有像我预期的那样执行:

case    
when -> { false } then "why?"
else "This is what I expect"
end
# => "why?"

这也不是

case
when ->(x) {false} then "why?"
else "This is what I expect"
end
# => "why?"

第一个 then 子句在两种情况下都被执行,这意味着我提供给 when 子句的 lambda 没有被调用。我知道无论 when 子句的主题是什么,都应该调用大小写相等运算符 === 。我想知道当没有为 case 提供参数时,=== 的另一边会发生什么。我在想它可能是 nil,但它不可能是:

-> {false} === nil
# => ArgumentError: wrong number of arguments (1 for 0)

->(x) {false} === nil
# => false

这按预期执行,如果正在执行,将导致我预期的 case 结果或异常。有人可以解释上面的结果吗?似乎根本没有使用大小写相等运算符,但第一个 when 子句的计算结果为 true。顺便说一句,我这样做是因为 case 的输出可用于变量赋值,而且它没有几个 elsif 子句那么冗长。我希望能够在不带参数的 case 语句中使用任意 Proc

最佳答案

case    
when -> { false } then puts "why?"
else puts "This is what I expect"
end

case
when 'cat' then puts "why?"
else puts "This is what I expect"
end

case
when -> { false }.call then puts "why?"
else puts "This is what I expect"
end

输出:

why?
why?
This is what I expect

正如 The Pickaxe ( http://pragprog.com/book/ruby3/programming-ruby-1-9 ) 所说,有两种形式的 case 语句。

The first allows a series of conditions to be evaluated, executing code corresponding to the first condition that is true: case when ‹ boolean-expression ›+ ‹ then › ...

The second form of a case expression takes a target expression following the case keyword. case target when ‹ comparison ›+ ‹ then › ...

在您的情况下(case 没有目标)任何不是 falsenil 的表达式(例如 Proc 或字符串 'cat ') 计算结果为真。 Proc 不会执行,除非您调用它。

关于ruby - 当你有一个没有参数的 case 语句并且 when 子句是 lambda 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449188/

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