1
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

这会产生堆栈级别太深的错误。这是怎么回事?

4

3 回答 3

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 }
于 2013-10-25T11:11:45.930 回答
3

是名字冲突。

yield names.shift

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

所以,很自然地,方法进入了递归,它不能从中脱离出来。

更新:

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

基本上,当打开方法定义时,当前范围会发生变化,并且所有局部变量都变得不可访问。因此,要么将数组作为方法参数传递(如史蒂夫的回答中所建议的那样,推荐),要么使数组成为实例变量。

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

def names
  yield @name_arr.shift
end
于 2013-10-25T10:41:27.753 回答
1

你想做的是像

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

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

于 2013-10-25T11:06:45.987 回答