动态地解析Ruby块参数

时间:2011-08-12 07:08:38

标签: ruby arrays block

最近关于ruby解构的好article将解构定义为将一组变量绑定到相应的值集合的能力,通常可以将值绑定到单个变量,并给出块解构的示例

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

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

在这种情况下,我们知道主数组中元素的数量,因此当我们提供参数first,second,third时,我们可以得到相应的结果。那么如果我们有一个数组的数组,其大小是在运行时确定的呢?

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

我们希望获得每个子数组的第一个条目的元素?

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

动态创建局部变量(first, second, third,...,n)的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

在您的具体情况下,您将使用splat收集除第一个值以外的所有内容:

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

*rest表示法只会收集留在名为rest的数组中的所有内容。

一般来说,创建任意数量的局部变量(second, third, ..., nth)没有多大意义,因为你无法对它们做任何事情;你可能会掀起一堆恶意但是我们已经拥有了一个优秀且功能齐全的数组类,为什么还要这么麻烦呢?

答案 1 :(得分:2)

如果这是数组数组:

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],...,[]]

在这种情况下,我会使用上面“mu”的建议

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

希望我已经抓住你的意图了,不好意思。