数组展平不起作用(实例变量为零)

时间:2010-05-21 18:59:23

标签: ruby

我试图编写一个简单的数组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

2 个答案:

答案 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]