2011-08-12 79 views
0

最近關於紅寶石解構良好article解構定義爲一組變量綁定到相應的一組值的任何地方,可以正常結合的值,以一個單一的可變能力,並給出了塊的示例解構解構紅寶石塊參數動態

triples = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

triples.each { |(first, second, third)| puts second } =>#[2, 5, 8] 

在這種情況下,我們有主陣列中的元件的數量的概念,因此,當我們首先提供的參數,第二,第三,我們可以得到相應的結果。那麼如果我們有一個大小在運行時確定的數組數組呢?

triples = [[1, 2, 3], [4, 5, 6], [7, 8, 9],...,[]] 

我們希望得到每個子陣列的第一個條目的元素?

triples.each { |(first, second, third,...,n)| puts first } 

什麼是(first, second, third,...,n)動態創建的局部變量的最佳方式?

+0

但是,爲什麼你需要動態創建變量? – Geo

+0

,因爲我想獲得每個子陣列的第n個元素。說20例如 – eastafri

+0

,因爲我想對每個子陣列的第n個指標的要素。每個子陣列的第31個索引的元素,假定子陣列包含超過31個元素。 – eastafri

回答

5

在特定情況下,你會用圖示來收集了一切,但第一個值:

triples.each { |first, *rest| puts first } 
#-----------------------^splat 

*rest符號只是收集剩下的到名爲rest數組的一切。

通常,創建任意數量的局部變量(second, third, ..., nth)沒有多大意義,因爲您無法對它們執行任何操作;你也許可以掀起一陣混亂的錯誤,但是我們已經有了一個很好的功能性的Array類,所以爲什麼要麻煩呢?

+0

說我想獲得每個子陣列的第n個索引的元素? – eastafri

+1

@eastafri:那麼你可以'{每個| X | ...}'和'說X [N-1]'或'休息[N-2]'如果你有'|第一,*休息|'。當你知道你有多少元素以及諸如'a,b = [11,23]'之類的東西時,'| k,v |'「解構」語法只是一個方便的速記,如果你不喜歡不知道你有多少元素,然後你使用一個數組並問它有多大。 –

1

,如果這是數組的數組:

triples = [[1, 2, 3], [4, 5, 6], [7, 8, 9],...,[]] 

,我們要遍歷的三元組,那麼這將工作,因爲內陣列僅具有各3個單元。

triples.each { |first, second, third| puts first } 

或者,你的意思是打字嗎?

new_triples = [[1, 2, 3,...,n], [4, 5, 6,...,n], [7, 8, 9,...,n],...,[]] 
在這種情況下

,我會用上面

new_triples.each { |first, *rest| puts first } 

希望我已經捕捉到你的意圖,否則對不起的「畝」的建議。