Массив Flatten не работает (переменная экземпляра ноль) - PullRequest
0 голосов
/ 21 мая 2010

Я пытался написать простой метод выравнивания массива, , но он не работает с использованием переменной экземпляра. Он работает только с использованием переменных класса. Может кто-нибудь сказать мне, почему? и как заставить это работать, используя переменные экземпляра.

 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 ]

1 голос
/ 22 мая 2010

Причина, по которой он не работает для переменных экземпляра, заключается в том, что 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
0 голосов
/ 25 мая 2010

Использовать родной 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...