最近一篇关于ruby destructuring的文章将destructuring定义为能够将一组变量绑定到通常可以将一个值绑定到单个变量的任何位置的一组对应值,并给出了一个block destructuring的示例。
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 }
动态创建局部变量的最佳方法是什么?
最佳答案
在您的特定情况下,您将使用splat收集除第一个值之外的所有值:
triples.each { |first, *rest| puts first }
#-----------------------^splat
*rest
符号只是将剩下的所有内容收集到一个名为rest
的数组中。一般来说,创建任意数量的局部变量(
second, third, ..., nth
)没有多大意义,因为您将无法对它们进行任何处理;您可能会生成一堆恶心的求值,但我们已经有了一个很好的函数数组类,所以何必费心呢?