我试图编写一个简单的数组flatten方法,但是它不能使用实例变量。它只能使用类变量。任何人都可以告诉我为什么?以及如何使用实例变量使其工作。
class Array
@y = []
def flatten_array
self.each do |x|
if x.class.to_s != 'Array'
@y << x
else
x.flatten_array
end
end
return @y
end
end
a = [1,2,3,4,5]
b = [6,7,8]
c = [9,10]
a1 = [12,13,a,b,c]
puts a1.inspect
b1 = a1.flatten_array
puts b1.inspect
答案 0 :(得分:1)
它不适用于实例变量的原因是x.flatten_array正在使用新的@y
,而不是你正在积累的那个def flatten_array
int_flatten(self, [])
end
private
def int_flatten(a, result)
a.each do |elem|
if (elem.is_a? Array)
int_flatten(elem, result)
else
result << elem
end
end
return result
end
。但是,以这种方式使用实例或类变量并不是一种好的做法,因为它有效地将全局变量用于本地函数。
编写需要额外变量的递归函数的标准过程是使用辅助函数:
def flatten_array
result = []
each do |elem|
if (elem.is_a? Array)
result += elem.flatten_array
else
result << elem
end
end
return result
end
或者只是愿意使用连接:
{{1}}
答案 1 :(得分:0)
使用原生Array#flatten
a = [1,2,3,4,5]
b = [6,7,8]
c = [9,10]
a1 = [12,13,a,b,c]
puts a1.inspect
#=> [12, 13, [1, 2, 3, 4, 5], [6, 7, 8], [9, 10]]
puts a1.flatten.inspect
#=> [12, 13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]