ruby - 动态解构 Ruby block 参数

标签 ruby arrays block

近期好货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/

相关文章:

arrays - 为什么调用此函数时 $args 数组为空?

arrays - 从 JSON 解析数组内的字典获取数据

javascript - JS : How to extract nested string of object?

存储来自用户的未知数量、未知大小的字符串的 C 程序 - 00558068 处的堆 block 在 00558096 处修改,过去请求的大小为 26

ruby - 在 ruby​​ 中调用 Klass::[] 和 Klass[] 有区别吗?

ruby - 如何从 Ruby 中的字符串 "A::B::C"获取类对象?

ruby-on-rails - 在 Rails 4 中更改临时目录

mysql - where not in Rails 3 是如何工作的

linux - 在没有 fflush(stdout) 的情况下将 block 缓冲数据写入文件

ios - 在等待上一个执行完成时循环遍历 block