此代码无法按预期执行:
case
when -> { false } then "why?"
else "This is what I expect"
end
# => "why?"
Run Code Online (Sandbox Code Playgroud)
这也不是
case
when ->(x) {false} then "why?"
else "This is what I expect"
end
# => "why?"
Run Code Online (Sandbox Code Playgroud)
第一个then子句在两种情况下都执行,这必然意味着when没有调用我对该子句提供的lambda .我理解===应该根据when子句的主题调用case相等运算符.我想知道在===没有提供参数的时候,另一方面会发生什么case.我在想它可能是nil,但它不可能是:
-> {false} === nil
# => ArgumentError: wrong number of arguments (1 for 0)
->(x) {false} === nil
# => false
Run Code Online (Sandbox Code Playgroud)
这按预期执行,如果正在执行,将导致我的预期case结果或异常.有人可以解释上面的结果吗?似乎案例相等运算符根本没有被使用,但第一个when子句正在评估true.顺便说一下,我这样做是因为a的输出case可以用于变量赋值,而且它有少量冗长,然后有几个elsif子句.我希望能够Proc在没有参数的case语句中使用任意s.
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
Run Code Online (Sandbox Code Playgroud)
输出:
why?
why?
This is what I expect
Run Code Online (Sandbox Code Playgroud)
正如The Pickaxe(http://pragprog.com/book/ruby3/programming-ruby-1-9)所说,有两种形式的案例陈述.
第一个允许评估一系列条件,执行与第一个条件相对应的代码为真:当<boolean-expression> + <then>时的情况......
case表达式的第二种形式采用case关键字后面的目标表达式.<比较> + <然后>时的案例目标...
在您的情况下(case没有目标)任何不是false或者nil(例如Proc或字符串'cat')的表达式的计算结果为true.除非您执行,否则Proc不会执行call.
您可以使用case不带参数的语句来执行与if语句类似的操作.例如:
case
when x > 0 then puts "positive"
else puts "negative"
end
Run Code Online (Sandbox Code Playgroud)
你假设它正在尝试比较nil,但事实并非如此.相反,当没有参数时,该case语句仅测试"truthy"值(除了nil和之外的任何值false).因此,当它命中你的第一个when语句时,它会检查你的Proc(意味着实际的ruby Proc对象,而不是执行你的结果Proc)是否是,nil或者false不是.由于它是"真实的",该代码被执行.
试试这个,你会发现Proc永远不会被调用/执行(你只会看到"bar",而不是"foo"):
case
when -> { puts 'foo' } then puts 'bar'
else puts "This line will never be printed"
end
Run Code Online (Sandbox Code Playgroud)