【问题标题】:Nicer syntax for looping through array of arrays in Ruby用于在 Ruby 中循环数组数组的更好语法
【发布时间】:2021-01-22 14:42:00
【问题描述】:

我有 A,一个长度为 3 的数组。例如 A = [[a1, b1, c3], [a2, b2, c2], [a3, b3, c3], [a4, b4, c4 ]]。现在我像这样循环遍历它:

A.each do |elem|
  puts(elem[0].foo)
  puts(elem[1].bar)
  puts(elem[2].baz)
end

由于我在循环中使用了许多不同的属性,因此代码变得非常混乱且难以阅读。另外,本地名称 elem[0] 不是很具有描述性。有没有办法使用这样的东西?

A.each do |[a,b,c]|
  puts(a.foo)
  puts(b.bar)
  puts(c.baz)
end

我对 ruby​​ 很陌生,我真的不知道在哪里可以找到这样的东西。

【问题讨论】:

  • 尝试do |a,b,c| 而不是do |[a,b,c]|
  • 谢谢,完美运行。出于好奇,这种东西叫什么?
  • 多重赋值,包括ruby在内的几种语言都有这个功能
  • Ruby 文档将其称为array decomposition。请注意,数组的大小必须已知包含三个元素才能将块变量表示为|a,b,c|
  • @CarySwoveland 说了什么;但是,如果数组包含超过 3 个元素但 ab 是命令式的,则可以使用带有 splat (*) 运算符的数组分解,这样 |a,b,*c|(习惯上使用 @987654331 @ 代替 *c)。在这种情况下,ab 将是 Array 的第一个和第二个元素,*c 将包含 0 个或多个标识其余 Array 的元素。

标签: arrays ruby-on-rails ruby each


【解决方案1】:

它被称为解构(或Ruby docs 中的分解):

A.each do |(a,b,c)|
  puts(a.foo)
  puts(b.bar)
  puts(c.baz)
end

如果元素数量未知,您也可以使用 splat (*) 来收集剩余元素:

[[1, 2, 3, 4], [5, 6, 7, 8]].each do |(first, *rest)|
  puts "first: #{first}"
  puts "rest: #{rest}"
end


[[1, 2, 3, 4], [5, 6, 7, 8]].each do |(first, *middle, last)|
  puts "first: #{first}"
  puts "middle: #{middle}"
  puts "last: #{last}"
end

【讨论】:

  • 请注意,如果块是使用一个数组参数生成的,则括号是可选的。这意味着A.each do |a,b,c| 也可以在这里工作。
  • @3limin4t0r 是的。我仍然喜欢他们,因为他们提醒人们正在解构。
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多