2

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

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

这会引发 no >= on NilClass 错误。但是,如果我这样做:

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]

是什么赋予了?

4

3 回答 3

6

<<的优先级高于&&。请参阅Ruby 运算符优先级

于 2013-08-09T03:21:14.463 回答
5

目前它被分组为:

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

尝试:

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

但是,如果它最终为假,则表达式返回nil,所以你想要:

boolean_array << (!input['amount'].nil? && input['amount'] >= 0)
于 2013-08-09T03:20:32.577 回答
5

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

问题是 在优先级<<之前&&,请参阅Rubydoc:precedence

所以这条线

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

实际上是:

(arr << false) && (puts 'what the heck?')
于 2013-08-09T03:22:22.293 回答