Ruby中调用产量的堆栈级别太深错误

时间:2013-10-25 10:39:21

标签: ruby

names = %w(Darko Marko Sarko Harko Yarko)

  def names
    yield names.shift
    yield names.shift
    yield names.shift
    yield names.shift
    yield names.shift
  end

names do |name|
  puts name
end

这会产生堆栈级别太深的错误。发生了什么事?

3 个答案:

答案 0 :(得分:4)

就像Sergio解释的那样,你需要将数组传递给方法

array_of_names = %w(Darko Marko Sarko Harko Yarko)

def names(array_of_names)
  yield array_of_names.shift
  yield array_of_names.shift
  yield array_of_names.shift
  yield array_of_names.shift
  yield array_of_names.shift
end

names(array_of_names) {|name| puts name }

答案 1 :(得分:3)

这是名字冲突。

yield names.shift

names这里是def names,而不是names = %w

因此,自然地,方法进入递归,其中不能突破。

更新

重命名数组(或方法)时出现“未定义局部变量”错误的原因是“范围门”。

基本上,当打开方法定义时,当前范围会更改,并且所有本地变量都将无法访问。因此,要么将数组作为方法参数传递(如Steve建议的答案中所建议的那样),要么将数组作为实例变量。

@name_arr = %w(Darko Marko Sarko Harko Yarko)

def names
  yield @name_arr.shift
end

答案 2 :(得分:1)

你想做的事情就像是

names = %w(Darko Marko Sarko Harko Yarko)
names.each do |name|
  puts name
end

这不仅可以让你使用可变长度数组,而且还可以避免递归错误。