| 
 
| 赞 | 295 |  
| VIP | 11 |  
| 好人卡 | 74 |  
| 积分 | 233 |  
| 经验 | 281171 |  
| 最后登录 | 2025-10-31 |  
| 在线时间 | 9470 小时 |  
 Lv5.捕梦者 (暗夜天使)   只有笨蛋才会看到 
	梦石1 星屑22289 在线时间9470 小时注册时间2012-6-19帖子7126  
 | 
| 本帖最后由 喵呜喵5 于 2023-3-14 13:38 编辑 
 merge 这一步是在做参数的合并
 
 
 复制代码{ 参数1: 1, 参数2: 2, 参数3: 3 }.merge({ 参数3: 4 }) # => { 参数1: 1, 参数2: 2, 参数3: 4 }
 在这个流程里就是把你要自定义参数和默认的参数合并到一起,作为一个最终的参数
 
 所以你这里的代码是有问题的,你覆盖了默认参数,然后就默认参数自己和自己合并了
 
 
 复制代码a={:x=>14,:y=>15,:z=>16} # 这一行,你把传入的参数a直接用默认参数覆盖了
a.merge(a) # 这一行,你自己在与自己合并,因此合并后的值没有变化
 原始的代码里其实还涉及一个点就是运算符优先级的问题
 
 
 复制代码params = { x: 15 }
params = { x: 12, y: 13, z: 14 }.merge(params)
 merge 的优先级高于赋值的优先级,因此实际执行的时候其实是先将 params 当前值作为 merge 的参数,最后再将 merge 的结果重新赋值给 params 作为最新值
 
 
 @soulsaga 6楼的回复其实也有问题
 
 merge 的作用是返回一个合并后的新哈希,因此,实际上应该这么去用
 
 
 复制代码a={:x=>4}
b={:x=>1,:y=>2,:z=>3}
c=b.merge(a)
p a,b,c
 如果不想用赋值的话可以用 merge! ,它的作用是合并已有的哈希
 
 
 复制代码a={:x=>4}
b={:x=>1,:y=>2,:z=>3}
b.merge!(a)
p a,b
 | 
 |