Ruby 考考你的 Ruby 基本功啦~~

zw963 · 2012年08月05日 · 最后由 daqing 回复于 2012年08月05日 · 2407 次阅读
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 的语法细节了

现实中谁也不会写这样的代码吧。。扣语法细节

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