为什么这种说法是这样的?(看跌("here") && break) vs (put "here" && break)

  • 本文关键字:here break 看跌 vs put ruby
  • 更新时间 :
  • 英文 :


语句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运算符优先级

最新更新