【问题标题】:How do I iterate to the next element in Ruby?如何迭代到 Ruby 中的下一个元素?
【发布时间】:2013-09-02 04:02:02
【问题描述】:

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

我知道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

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

【问题讨论】:

  • 可能你可以给出一个数组并通过演示该数组来提出问题..
  • 我不清楚您要解决的确切问题。也许您可以提供 Ruby 或 C 中的 while 版本来演示?
  • @Confusion 我也很困惑.. :)
  • 对不起,这个问题令人困惑。我会尽量澄清。
  • @confusion 或任何对帖子投反对票的人,请让我知道我的编辑是否有助于澄清它。谢谢。

标签: ruby


【解决方案1】:

简单。将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

【讨论】:

  • 这会让我跳过我处理过的行吗? IE。如果我在循环中使用text[i+1],那么我不想让循环的下一次迭代使用该值?
  • @Linuxios 仍然不正确.. :) 如果 num_of_parts_to_element 并非针对所有情况都固定...
  • 我的问题应该更清楚。元素的数量在找到时是固定的。但我也有一些在解析过程中被删除的行。
  • @Gabriel:“在解析期间剥离”是什么意思?
  • @Gabriel:早点删除那些。在循环之前,使用text.delete_if {|l| l.chomp.empty? || other_case || another_case}等等。
【解决方案2】:

在 cmets 中接受@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 分离到一个方法中,因为我想您会想做其他事情,而不仅仅是将元素连接并打印到标准输出。

顺便说一句,我没有投反对票,只是要求澄清

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 2011-12-31
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多