近期好货article关于 ruby 的解构将解构定义为将一组变量绑定(bind)到一组相应的值的能力,在任何地方你通常可以将一个值绑定(bind)到一个变量,并给出了一个 block 解构的例子
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)
的最佳方法是什么?
最佳答案
在您的特定情况下,您将使用 splat 收集除第一个值以外的所有内容:
triples.each { |first, *rest| puts first }
#-----------------------^splat
*rest
符号只是将剩下的所有内容收集到一个名为 rest
的数组中。
一般来说,创建任意数量的局部变量(second, third, ..., nth
)没有多大意义,因为您无法对它们做任何事情;您可能会搞出一堆恶心的 eval,但我们已经有了一个功能完善的 Array 类,所以何必呢?
关于ruby - 动态解构 Ruby block 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7036707/