b = false || true c = false or true
b 的值是 true
c 的值竟然是 false
这个叫做 Short-circuit evaluation,Ruby 表示这个锅我不背。
运算符优先级的问题,加个括号就明白了
and or 比 = 优先级低,用在 control flow 挺方便
比如 (order = Order.first) && order.number == "a" 可以写成 order = Order.first and order.number == "a"
相对 order.number == "a" if order = Order.first 不用适应英文的语序,更多级联的时候也更好写
不过 rails 不推荐 http://stackoverflow.com/questions/2083112/difference-between-or-and-in-ruby
建议看看 Ruby Programming 运算符那章,优先级由高到低 || = and or 你可以按着优先级加括号 b = (false || true) (c=false) or true
说到这个... 引申一下 如果想从字典里取值,如果没有值则使用默认值,千万不要用 hash[:key] || 'yoooo~' 的写法,如果 hash[:key] 有值且为 false,那么表达式的结果则为 yoooo~,要用 hash.fetch(:key, 'yoooo~') 的方式来做
hash[:key] || 'yoooo~'
hash[:key]
false
yoooo~
hash.fetch(:key, 'yoooo~')
运算符优先级问题。
不过,很多教程上没有强调 || 和 or 的优先级差异,可能会让不少初学者遇到。
||
or