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
这会产生堆栈级别太深的错误。这是怎么回事?
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
这会产生堆栈级别太深的错误。这是怎么回事?
正如 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 }
是名字冲突。
yield names.shift
names
这里是def names
,而不是names = %w
所以,很自然地,方法进入了递归,它不能从中脱离出来。
重命名数组(或方法)时出现“未定义的局部变量”错误的原因是所谓的“范围门”。
基本上,当打开方法定义时,当前范围会发生变化,并且所有局部变量都变得不可访问。因此,要么将数组作为方法参数传递(如史蒂夫的回答中所建议的那样,推荐),要么使数组成为实例变量。
@name_arr = %w(Darko Marko Sarko Harko Yarko)
def names
yield @name_arr.shift
end
你想做的是像
names = %w(Darko Marko Sarko Harko Yarko)
names.each do |name|
puts name
end
这不仅可以让您使用可变长度数组,还可以避免递归错误。