使用递归的Ruby移位和切片问题

时间:2014-01-29 03:33:42

标签: ruby

有人可以向我解释为什么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

2 个答案:

答案 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