有人可以向我解释为什么Array slice或shift会返回与args -= [args.frist]
我想输出[[1, 2, 3], [2, 3], [3], []]
。
def run(args=[1,2,3],results=[])
results << args
return results if args.size < 1
args -= [args.first]
run(args,results)
end
VS
def run(args=[1,2,3],results=[])
results << args
return results if args.size < 1
args.shift
run(args,results)
end
答案 0 :(得分:1)
Ruby 按值传递。但这些对象实际上是参考。让我解释。当你这样做时:
s = 'abc'
s1 = s
s1.gsub! /a/, 'A'
puts s
# ⇒ 'Abc'
除非你dup
一个对象,否则所有引用都将指向相同的内存块。这就是为什么你的第二个例子args
不仅被修改,而且被修改为results
数组。
该行
args -= [args.first]
但是,实际上不会更改作为参数给出的数组。它声明了新的局部变量并对其进行了更改。已放入results
值的引用保持不变。
run args.dup.shift, result
会做到这一点。
答案 1 :(得分:0)
因为所有args
都引用相同的数组。
为避免这种情况,请勿修改args
。
相反,请复制一份:
def run(args=[1,2,3],results=[])
results << args
return results if args.size < 1
run(args[1..-1], results)
end