Ruby 发现一个坑

sevk · 2017年04月13日 · 最后由 kgen 回复于 2017年04月13日 · 1260 次阅读
b = false || true
c = false or true

b 的值是true

c 的值竟然是false 😃

共收到 6 条回复
1楼 已删除

这个叫做 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~') 的方式来做

运算符优先级问题。

不过,很多教程上没有强调 ||or 的优先级差异,可能会让不少初学者遇到。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册