h = {} def h.[]=(k, v) puts "Setting hash key #{k} with #{v.inspect}" super end h[:x] ||= 10 h[:x] ||= 20 h[:y] = h[:y] || 10 h[:y] = h[:y] || 20 h[:z] || h[:z] = 10 h[:z] || h[:z] = 20
先想想,再执行。看看输出和你想的一样不?
我是先执行 再想,呵呵
挺有意思的
呵呵 偶来剧透 只要记住 || 比 = 的优先级高就行了
#3 楼 @cxh116
... 这不是考你优先级... 汗~~ 要是那么简单就没意思了。
给点提示好了
Do not confuse [op]=(e.g. +=) with anything related to ||= or &&=. They're entirely different ideas and are implemented entirely different[ly].
h[:x] ||= 10 # call []= h[:x] ||= 20 # not call []= h[:y] = h[:y] || 10 # call []= h[:y] = h[:y] || 20 # call []= h[:z] || h[:z] = 10 # call []= h[:z] || h[:z] = 20 # not call []=
之前有人讲过这样的问题,最出乎意料的是 ||= 这样的表达式,它不是等价于 a = a || b, 而是等价于 a or a = b, 从这点上看 3 楼的结论是正确的。
#4 楼 @zw963 看来我想错了 要再复习一下 Ruby 的语法细节了
现实中谁也不会写这样的代码吧。。扣语法细节