语句1:
[2,4,6,7,8].each do |i|
(i % 2 == 0) || (puts "Not even" && break)
puts i
end
声明2:
[2,4,6,7,8].each do |i|
(i % 2 == 0) || (puts("not even") && break)
puts i
end
语句1中断但不放入,语句2放入但不中断
为什么它会这样,我怎么能把这个表达写得更好呢?(我的意思不是寻找奇数,我的意思是||&&语句(
语句1:
Ruby这样解释:puts("Not even" && break)
。因此,在解析puts
参数之前执行break
。
声明2:
puts("not even")
返回nil
,因此根本不执行break
如果你真的希望它是内联的,我建议在没有&&
:(puts "Not even"; break)
的情况下写这篇文章
我怎么能把这个表达式写得更好
不要[在想要使用流控制语句的地方编写表达式]。
使用这样的布尔表达式进行流控制充其量是脆弱的。更可能的是,它只是令人困惑和难以理解。例如,与此相比。
[2,4,6,7,8].each do |i|
if i % 2 != 0 # if i.odd?
puts 'not even'
break
end
puts i
end
选择哪种风格,取决于你追求的是什么:可读性还是简洁性。如果您不参与代码高尔夫球,我想说,每次都要选择可读性。
puts "Not even" && break
等于puts("Not even" && break)
,将执行break,因此循环将中断。
puts("not even")
将返回nil
。
puts("not even") && break
等于:nil && break
,break不执行,所以循环不中断。
原因是函数应用程序的优先级低于Ruby中的任何运算符。
所以
puts "Not even" && break
成为
puts ("Not even" && break)
(&&
在函数调用之前进行评估(。另请参阅Ruby运算符优先级