[2,4,6,7,8].each do |i|
(i % 2 == 0) || (puts("not even") && break)
puts i
end
声明2:
{{1}}
声明1中断但不放,声明2放弃但不会中断
为什么它会这样表现,我怎么能更好地写这个表达式呢? (我不是指寻找奇怪的#s,我的意思是||&&和声明)
答案 0 :(得分:4)
声明1:
Ruby将其解释为:puts("Not even" && break)
。
因此break
在解析puts
参数之前执行。
声明2:
puts("not even")
会返回nil
,因此break
根本不会执行
如果你真的希望它是内联的,我建议不要&&
写这个:(puts "Not even"; break)
答案 1 :(得分:4)
我怎么能更好地写这个表达
不要[写表达式表示您使用流量控制语句]。
使用布尔表达式进行流量控制就好了。并且,更可能的是,只是令人困惑和难以理解。例如,与此相比。
[2,4,6,7,8].each do |i|
if i % 2 != 0 # if i.odd?
puts 'not even'
break
end
puts i
end
选择哪种风格取决于您所追求的内容:可读性或简洁性。如果你没有参加代码高尔夫,我会说,每次都选择可读性。
答案 2 :(得分:3)
puts "Not even" && break
等于puts("Not even" && break)
,将执行break,因此循环将会中断。
puts("not even")
将返回nil
。
puts("not even") && break
等于:nil && break
,不执行break,因此循环不会中断。
答案 3 :(得分:2)
原因是function application has a lower precedence than any operators in Ruby。
所以
'smth, smth2'
变为
puts "Not even" && break
(在函数调用之前评估puts ("Not even" && break)
)。另请参阅Ruby operator precedence