赞 | 287 |
VIP | 11 |
好人卡 | 74 |
积分 | 226 |
经验 | 281171 |
最后登录 | 2024-10-28 |
在线时间 | 9407 小时 |
Lv5.捕梦者 (暗夜天使) 只有笨蛋才会看到
- 梦石
- 1
- 星屑
- 21584
- 在线时间
- 9407 小时
- 注册时间
- 2012-6-19
- 帖子
- 7117
|
本帖最后由 喵呜喵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
复制代码 |
|