【问题标题】:Return to Each Iterator from For Loop从 For 循环返回每个迭代器
【发布时间】:2013-04-24 23:58:52
【问题描述】:

我想知道是否可以在传递给 Each 的块中的 for 循环中返回 Ruby 中的 Each 迭代器。

def find member = ""

        productHash = {}

            #@entries is a hash, with both the keys and values being strings
            #the member parameter is a string

        @entries.each do |key, value|

            for i in 0...member.size

                if(key[i] != member[i])
                    next #the next keyword doesn't work...all it does is return to the for iterator.  I'm looking for a keyword that would return to the each iterator, and allow each to pass back in the next key-value pair.
                end

            end

            productHash[key] = value


        end

        productHash

end

我想要完成的是:当我看到成员参数中的一个字符与给定键中的相应字符不匹配时,我会转到下一个键值对。

【问题讨论】:

  • 为什么要使用 for 循环?你为什么不用一个块做一个 each 方法?
  • @jason328 这有什么帮助?我相信这个问题仍然是一样的。我在这里使用 for 循环的原因是我可以跟踪索引号,以便与参数“member”中的相应字符进行比较。我想从概念上讲,我的问题是是否有任何 return 语句(例如 break、next、return)区分 for 循环迭代器和 each 迭代器。
  • 我很难理解你的问题。使用each_with_index 对你有帮助吗?
  • 什么是member?一个数组?
  • 看起来像。我怀疑这是伪代码,因为如果不添加一些参数,该方法就无法工作。

标签: ruby for-loop block


【解决方案1】:

看起来您正在尝试进行某种比较,如果键与 member 指定的特定前缀匹配,那么您将进行分配。

这段代码在功能上应该类似:

def find(member = "")
  hash = { }

  @entries.each do |key, value|
    # Unless key begins with prefix, skip it.
    next unless (key[0, prefix.length] == prefix)

    hash[key] = value
  end

  hash
end

Ruby 中没有官方的 goto 声明,许多人会认为这是一件好事,但这意味着从嵌套块中破坏可能有点棘手。

不过,如果您以正确的方式解决问题,几乎总有一个足够优雅的解决方案。

更新:

要打破嵌套循环,一种方法可能是:

list.each do |i|
  broken = false

  inner_list.each do |j|
    if (j > 10)
      broken = true
      break
    end
  end

  break if (broken)
end

【讨论】:

  • 非常感谢!只是为了验证,有没有办法从 for 循环中退出到我的代码中的每个迭代器?
  • 老实说,没有人在 Ruby 中使用for,除了以前使用过 Ruby 的人。而是使用 each 迭代器或 Enumerable 中的其他内容。要退出两个级别,如果您可以立即退出该方法,return 通常会成功。作为替代方案,设置一个标志和break,如果设置了该条件,则再次设置break
  • 我已经用一个简短的例子修改了我的答案。
  • 这是有道理的。我想我的问题在概念上归结为是否有任何关键字 return、break 和 next 区分了 for 循环和 each 方法。看起来他们没有,所以设置一个标志总是必要的。
  • 是的,它们只影响当前循环上下文。其他一些语言支持具有可选目标标签的break,但 Ruby 不支持。