Ruby中非变异式数组push等价实现方法咨询
Ruby中实现非变异式数组元素添加的等价方法
嘿,这个问题问得很到位!确实,Ruby里的concat方法会直接修改原数组(属于mutating操作),如果想要实现不改动原数组、返回全新数组的非变异式元素添加,有几个实用的方法可以选:
1. 使用+运算符(最直观的首选)
这是Ruby里最常用的非变异数组合并方式,它会把原数组和待添加的数组合并后返回一个新数组,原数组完全保持不变:
original_array = [1, 2, 3] new_array = original_array + [4, 5, 6] # original_array 仍然是 [1, 2, 3] # new_array 结果为 [1, 2, 3, 4, 5, 6]
如果只是添加单个元素,直接把元素放进数组里就行:original_array + [7]。
2. 先复制原数组再用concat
如果你习惯concat的语法逻辑,可以先通过dup方法复制一份原数组,再对复制后的数组执行concat,这样原数组就不会被修改:
original_array = [1, 2, 3] new_array = original_array.dup.concat([4, 5, 6]) # original_array 还是 [1, 2, 3] # new_array 结果为 [1, 2, 3, 4, 5, 6]
dup会创建原数组的浅拷贝,对于存简单元素的数组完全够用;如果数组里有复杂对象需要深拷贝,可以换成clone(不过大部分场景下dup就足够了)。
注意避开变异陷阱
别混淆哦:Ruby的append和push都是变异方法,会直接修改原数组。如果非要用类似写法实现非变异,还是得结合复制操作,比如original_array.dup.append(4,5,6),但这种写法不如+运算符简洁,一般不推荐。
总结下来,最推荐的非变异式数组元素添加方法就是**+运算符**,简洁直观还符合Ruby的惯用写法;如果需要批量添加元素或者习惯concat的逻辑,就用dup.concat的组合方案。
内容的提问来源于stack exchange,提问作者Karol Selak
相关产品推荐
相关产品推荐

