如何迭代到Ruby中的下一个元素?

时间:2013-08-31 21:36:21

标签: ruby

有没有办法在不从循环开始处开始的情况下获取循环中的下一个元素?

我知道next允许迭代到下一个元素,但它从循环开始处开始。我想得到下一个元素并继续循环中的下一个语句。

我正在解析一个结构如下的文本文件:

element 1
part 1
part 2

element 2
part 1
part 2

请注意,每个元素有11个部分,所以这只是一个例子。此外,有时会在解析过程中删除线条,因此我不认为每次循环迭代都可以通过固定数量的元素前进。

我将所有文本读入数组,然后我想用以下内容处理每一行:

text.each do |L|
  #if L is new element create object to store data
  #parse next line store as part 1
  #parse next line store as part 2
end

我知道如何使用while循环和类似C的编码样式来执行此操作,其中我显式地索引数组并将索引变量按每次我想要的量递增,但我想知道是否有一种Ruby方法可以做到这一点。类似于next的东西,但它会从循环中的同一点继续,只是与下一个元素一起,而不是从循环的开头开始。


编辑:

以下是我如何使用while循环解决此问题的简化示例:

text = ["a", "b", "c", " ", " ", "d", "e", "f"]
i = 0
while i < text.length do
  if text[i] == " " then
    i += 1
  else
    a = text[i]
    b = text[i+1]
    c = text[i+2]
    puts a + b + c
    i += 3
  end
end

请注意我写的实际代码更复杂。我试图在这里提出一个最简单的例子,说明我想做什么。

2 个答案:

答案 0 :(得分:3)

简单。将each更改为each_with_index,然后使用索引:

text.each_with_index do |L, i|
  #Get next element
  text[i + 1]
end

但是,您的具体问题有一个更好的解决方案。使用each_slice

text.each_slice(num_of_parts_to_element + 1) do |element|
  element[0] #element 1
  element[1..-1].each do |part|
    #Iterate over the parts
  end
end

答案 1 :(得分:1)

在评论中提出@Phrogz的建议并运行它:

def handle_sequence(sequence)
  puts sequence.join
end

text = ["a", "b", "c", " ", " ", "d", "e", "f"]
sequences = text.split(" ")
sequences.reject! {|sequence| sequence.empty?}
sequences.each {|sequence| handle_sequence(sequence)}

我将handle_sequence分成了一个方法,因为我想你不想再做其他事情,只需连接并将元素打印到stdout。

顺便说一句,我没有做出选择,只是要求澄清