2010-05-21 71 views
0

我正在嘗試編寫一個簡單的數組展平方法,,但它無法使用實例變量。它只能使用類變量。誰能告訴我爲什麼?以及如何使用實例變量進行工作。數組平展不起作用(實例變量無)

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

只是好奇:你想完成什麼?已經有一個'Array#flatten',你知道... – 2010-05-21 19:13:33

+0

爲什麼你想使用一個實例變量而不是局部變量? – 2010-05-21 19:29:30

+0

標題中有「實例」錯別字。 – 2010-05-23 23:37:19

回答

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 
+0

發送至:Marc-AndréLafortune 我只想寫我自己的array_flatten以更好地理解Ruby。 發送至:Andrew Grimm 謝謝您指出標題中的錯字。但是,這並沒有回答我的問題。 Kathy, 感謝您的答覆。我在想,局部變量可能不起作用,但顯然我錯了。我試了兩個你的代碼片段。第二個工作,第一個沒有。請看下面。 – Nick 2010-05-24 16:44:05

+0

Snippet1: 類Array DEF flatten_array int_flatten(個體,[]) 端 私人 DEF int_flatten(一,結果) a.each做| ELEM | 如果(elem.is_a?陣列) int_flatten(ELEM,結果) 別的 結果<< ELEM 端 端 端 端 A = [1,2,3,[4,5,6 ,[7,8,9]]] b = a.flatten_array 放b.inspect 輸出: [1,2,3,[4,5,6,[7,8,9]]] – Nick 2010-05-24 16:46:27

+0

Snippet2: class Array def flatten_array result = [] each do | elem | 如果(elem.is_a?陣列) 結果+ = elem.flatten_array 別的 結果<< ELEM 端 端 返回結果 端 端 A = [1,2,3,[4, 5,6,[7,8,9]]] b = a.flatten_array puts b。檢查 輸出:[1,2,3,4,5,6,7,8,9] – Nick 2010-05-24 16:48:58

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]