为什么这个陈述是这样的? (put(" here")&& break)vs(puts" here"&& break)

时间:2015-10-09 09:00:48

标签: ruby

声明1:

[2,4,6,7,8].each do |i|
    (i % 2 == 0) || (puts("not even") && break)
    puts i
end

声明2:

{{1}}

声明1中断但不放,声明2放弃但不会中断

为什么它会这样表现,我怎么能更好地写这个表达式呢? (我不是指寻找奇怪的#s,我的意思是||&&和声明)

4 个答案:

答案 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