Ruby数组循环总是成对的。

10

我有以下数组:

a = ['sda', 'sdb', 'sdc', 'sdd']

现在我想循环遍历这些条目,但每次只循环两个元素。目前,我是这样做的:

while b = a.shift(2)
  # b is now ['sda', 'sdb'] or ['sdc', 'sdd']
end

这种方式感觉有些不对,有没有更好的方法?是否有一种简便的方法来获取像[['sda','sdb'],['sdc','sdd']]这样的内容?

我阅读了http://www.ruby-doc.org/core-1.9.3/Array.html,但是没有找到有用的信息...


2
尝试阅读文档,加1分。 - Andrew Grimm
2个回答

19
您可能想看一下Enumerable,它被包含在Array中。您想要的方法是Enumerable#each_slice,它会重复从可枚举对象中产生给定数量的元素(如果末尾没有那么多元素,则产生较少的元素):
a = ['sda', 'sdb', 'sdc', 'sdd']
a.each_slice(2) do |b|
    p b
end

产生:
$ ruby slices.rb 
["sda", "sdb"]
["sdc", "sdd"]
$

好的,没问题...我查看了Enumerator... - Raffael Schmid
是的,它们非常相似;请注意 Enumerator 实际上也包括了 Enumerable;你可以将 Enumerator 看作是一个通用的接口来进行枚举操作;如果你调用 [1, 2, 3].each 或者 ['sda', 'sdb', 'sdc', 'sdd'].each_slice(2) ——两者都没有块——你将得到一个 Enumerator 实例,然后你可以进一步对其进行操作。 - Asherah
['sda', 'sdb', 'sdc', 'sdd'].each_slice(2).to_a 这样。 - steenslag

0
如果您需要使用严格的对进行工作,您可能希望使用Enumerable#each_cons方法。以下是each_sliceeach_cons之间的区别:
a = ['a', 'b', 'c', 'd', 'e']
a.each_slice(2) { |i| p i }
# ["a", "b"]
# ["c", "d"]
# ["e"]
a.each_cons(2) { |i| p i }
# ["a", "b"]
# ["b", "c"]
# ["c", "d"]
# ["d", "e"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接