在数组迭代的特定情况下,Ruby方式代替for循环

jucafojl  于 2023-05-22  发布在  Ruby
关注(0)|答案(2)|浏览(185)

来自其他语言,其中for循环是主要的迭代方式,我很好奇是否有更好的Ruby风格的方式来实现以下内容:

q=[5,1,7,9,0,3,6,8,0]

for i in 0..q.size/3-1

  do one thing with q[0+i*3]

  do another one with q[1+i*3]

  third operation on q[2+i*3]

end

谢谢!
提交的有问题的代码实际上是可以工作的,但是知道Ruby中的for在引擎盖下使用了每一个,我不确定什么是使它更紧凑和高效的最佳方法。

ctrmrzij

ctrmrzij1#

Ruby最常用的方法可能是使用Enumerable#each_slice

q.each_slice(3) do |first, second, third|
  # do something with `first`
  # do another thing with `second`
  # third operation with `third`
end

例如:

q.each_slice(3) do |first, second, third|
  p({ first:, second:, third: })
end
# { first: 5, second: 1, third: 7 }
# { first: 9, second: 0, third: 3 }
# { first: 6, second: 8, third: 0 }

一般来说,在 any 程序中最重要的操作之一是“迭代内容”(或者更一般地说,遍历、转换、过滤、构建和折叠集合),在Ruby中,这是由Enumerable mixin处理的。学习和理解这个mixin的文档对于编写好的、地道的Ruby代码是至关重要的。
作为一个(稍微夸张的)一般规则,如果你必须在Ruby中编写一个循环或手动摆弄索引或计数器,你很可能做错了什么。事实上,随着大多数现代编程语言所附带的强大算法、数据结构和集合库,这不仅适用于Ruby,而且几乎是普遍适用的。

n6lpvg4x

n6lpvg4x2#

正如已经指出的,each_slice是这里的理想答案。
然而,如果你纯粹对循环 * 数字索引 * 感兴趣,将你的代码转换成更符合Ruby习惯的东西,你可以使用范围和step以3为增量向前移动:

q=[5,1,7,9,0,3,6,8,0]

(0..q.size - 1).step(3) do |i|
  a = q[i]
  b = q[i + 1]
  c = q[i + 2]

  p [a, b, c]
end

# [5, 1, 7]
# [9, 0, 3]
# [6, 8, 0]

相关问题