2012-03-10 45 views
1

正如標題所說......如果我有一個包含子陣列的數組是否可以拆分數組並重新命名新的拆分數組?我知道我可以簡單地輸入new_array = array [0]等,但問題是包含子陣列的原始數組大小會有所不同。紅寶石 - 拆分和重命名的子陣列

原數組......

array=[["a", "1", "2", "3"], ["b", "1", "2", "3"], ["c", "1", "2", "3"]...] 

分裂,並更名爲陣列...

array1=["a", "1", "2", "3"] 
array2=["b", "1", "2", "3"] 
array3=["c", "1", "2", "3"]... 

我希望是有道理...感謝 弗蘭克

+1

是否有潛在的實際使用情況爲此,還是這只是一個功課問題?我明白你在問什麼,並且mu太短提供了一個合理的解決方案,但是如果你正在努力完成的事情需要這樣做,那麼一些背景將會有所幫助。 – 2012-03-10 06:57:10

回答

1

我看到毫不誇張地說,你在找什麼做的唯一途徑是:

array=[["a", "1", "2", "3"], ["b", "1", "2", "3"], ["c", "1", "2", "3"]] 

array.each_with_index do |element, i| 
    instance_variable_set "@array#{i + 1}", element 
end 

puts @array1 # => ["a", "1", "2", "3"] 
puts @array2 # => ["b", "1", "2", "3"] 

但當然這很醜陋。除非你絕對需要這樣做,否則你應該找到一種方法來使用你的數組而不把它轉換成一個變量列表。您通常不需要將其轉換爲散列值 - 這只是將一種索引樣式轉換爲另一種索引樣式,並且不會提供任何附加功能。

有趣的是,注意,這是行不通的,因爲的eval(和每個塊)都有自己的範圍,這是不符合頂級範圍共享:

array.each_with_index do |element, i| 
    eval("array#{i + 1} = element") 
end 

puts array1 # => NameError 
+0

對於遲到的回覆感到抱歉,沒有時間來試試這個。感謝您提供的幫助完全符合我的要求,並且您說得對,這有點混亂和困惑,但這是我想到的唯一想法。我能想到但唯一不知道如何去做的其他事情就是訪問子陣列的子元素。例如:將「a」,「b」,「c」的值作爲新數組或單獨獲取。合理??? – JoMojo 2012-03-13 00:56:50

+0

你可以做'@ array1 [0]'(=「a」),'@ array1 [1]'(=「1」)等。這就是你的意思嗎? – user2398029 2012-03-13 00:59:20

+0

不,不完全一樣。使用我的OP ... array = [[「a」,「1」,「2」,「3」],[「b」,「1」,「2」,「3」], [「c」,「1」,「2」,「3」] ...]。我知道我可以用數組[0]返回數組[0] = [「a」,「1」,「2」,「3」]來獲取子數組。但那我怎麼能從那裏得到元素「a」?就像數組[0,0] =「a」,數組[0,1] =「1」...抱歉,如果我的解釋混亂,但我相信你已經意識到,作爲一個整體,我很困惑:) – JoMojo 2012-03-13 01:23:21

1

你可以做一些花哨-pants的東西來創建一堆變量來保存子數組,但是你必須做更多混淆花哨的東西來處理新的變量。每當你覺得你要動態地創建一組變量,通常要創建一個哈希作爲一個小便攜的命名空間:

arrays = Hash[array.inject([]) { |m, a| m << ["array#{m.length + 1}", a] }] 

這會給你這arrays

{ 
    "array1" => ["a", "1", "2", "3"], 
    "array2" => ["b", "1", "2", "3"], 
    "array3" => ["c", "1", "2", "3"] 
} 

,這就是除了一些新的變量,你的名字在運行時纔會知道,這比使用它更容易。

你可以用更簡單的東西建立相同的結構,如果你是這樣的傾向:

arrays = { } 
array.each_with_index { |a, i| arrays["array#{i + 1}"] = a } 
+0

感謝您的回覆mu太短...我嘗試了你的建議,它有點作用,但後來我endup需要檢索重命名陣列[]。例如,我無法使用array1。請記住,嘗試操作數組對我來說是非常新的。 – JoMojo 2012-03-10 05:27:26

+0

@FrankN:但你可以問'陣列'它有哪些鍵。如果你動態地創建了一個'array11'變量,你怎麼知道你有哪些變量名?一旦你知道你有11個,你就會做更多的動態操作來根據他們的名字訪問變量。你可以通過使用哈希而不是動態創建變量來跳過所有這些工作。使用哈希也很好地避免了可能的名稱衝突和衝突。 – 2012-03-10 05:57:21

+0

感謝您的信息。我不太瞭解哈希如何工作,但我會研究它們,也許它們正是我所需要的,永遠不知道它。 :)我承認,我有點頭大,但嘗試和學習新的東西並得到想要的結果很酷。 – JoMojo 2012-03-10 06:49:41