Я пытался написать простой метод выравнивания массива, , но он не работает с использованием переменной экземпляра. Он работает только с использованием переменных класса. Может кто-нибудь сказать мне, почему? и как заставить это работать, используя переменные экземпляра.
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
Причина, по которой он не работает для переменных экземпляра, заключается в том, что x.flatten_array использует новый @y, а не тот, который вы накапливали. Однако использование переменной экземпляра или класса таким способом не является хорошей практикой, поскольку эффективно использует глобальную переменную для локальной функции.
@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
Использовать родной Array#flatten
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]