为什么&&在Ruby中有时快捷方式评估,有时候不是吗?

时间:2013-08-09 03:14:29

标签: ruby

我想测试散列中是否存在元素,如果它是> = 0,则将true或false放入数组中:

boolean_array << input['amount'] && input['amount'] >= 0

这在NilClass错误上没有引发&gt; =。但是,如果我这样做:

input['amount'] && input['amount'] >= 0   #=> false

没问题。基本上是:

false && (puts 'what the heck?') #=> false
arr = []
arr << false && (puts 'what the heck?') #=> stdout: 'what the heck?'
arr #=> [false]

是什么给出了?

3 个答案:

答案 0 :(得分:6)

<<的优先级高于&&。请参阅Ruby Operator Precedence

答案 1 :(得分:5)

目前它被归为:

(boolean_array << input['amount']) && input['amount'] >= 0

尝试:

boolean_array << (input['amount'] && input['amount'] >= 0)

但是,如果它最终为false,则表达式返回nil,因此您需要:

boolean_array << (!input['amount'].nil? && input['amount'] >= 0)

答案 2 :(得分:5)

&&总是在Ruby中评估短路。

问题是<<优先于&&,请参阅Rubydoc:precedence

所以行

arr << false && (puts 'what the heck?')

实际上是:

(arr << false) && (puts 'what the heck?')