【问题标题】:Both for & each loops stop after first match when iterating through a hash in ruby遍历 ruby​​ 中的哈希时,for & each 循环在第一次匹配后停止
【发布时间】:2016-07-08 19:32:00
【问题描述】:

我正在尝试打印出对应键匹配某个条件(如果它们是奇数)的哈希值。

我遇到了一个问题,导致我的循环在

之后停止工作

下面的代码只返回第一个匹配的值。

if mycondition
 for key,value in myhash do
   if key.odd?
     return "#{value}"
   end
 end
end

在阅读了一些其他问题后,我认为return 是我的问题,但是当我将其取出时,代码会返回整个哈希而不是一个匹配值。

有人知道会发生什么吗?

【问题讨论】:

    标签: ruby loops if-statement hash return


    【解决方案1】:

    一旦你return,功能就结束了,所以你只能得到一把钥匙。

    如果您没有 return 任何内容,则该函数将返回其最终表达式,在本例中为 for 循环。 for 循环评估你循环的东西 (myhash),所以这就是为什么删除 return 会给你一切。

    在您的情况下,您需要建立要返回的内容列表,并返回整个列表:

    if mycondition
      ret = []
      for key, value in myhash do
        if key.odd?
          ret << [key, value]
        end
      end
      return Hash[ret]
    end
    

    但是 Ruby 有更好的方法来提取哈希的子集,例如:

    Hash[myhash.select{|k,v| k.odd?}]
    

    【讨论】:

    【解决方案2】:

    这是一种更加 Ruby 的方式:

    myhash.select do |key, value|
      key.odd?
    end.values
    

    在这里它找到所有奇数键并返回相关值。

    return 的问题在于,它会强制整个方法立即退出。如果您习惯了 JavaScript,这可能会有点令人困惑,因为您不只是退出 do 块。

    请注意,for 构造几乎从未在 Ruby 中使用过。表达原始代码的更传统方式是:

    myhash.each do |key, value|
      # ...
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2023-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2021-07-28
      相关资源
      最近更新 更多