【问题标题】: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