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
这会产生堆栈级别太深的错误。发生了什么事?
答案 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
这不仅可以让你使用可变长度数组,而且还可以避免递归错误。