2011-08-12 77 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 } 

希望我已经捕捉到你的意图,否则对不起的“亩”的建议。