1

我有这个哈希和这个数组,并执行以下命令......

hash={"a"=>1,"b"=>2,"c"=>3,"d"=>4,"e"=>5,"f"=>6}
array=["b","a","c","f","z","q"]
print hash.values_at(*array).compact

所以我希望它返回如下内容:

#=> [2,1,3,6,"invalid","invalid"]

有没有办法将哈希中不存在的所有其他元素声明为“无效”,而无需一一声明(例如“g”=>“invalid”、“h”=>“invalid”...)?

4

3 回答 3

3

如果哈希必须以不存在的键的默认值响应,则必须设置该值。通常它是在哈希的初始化时设置的:

hash = Hash.new("invalid")

但它可以随时完成

hash={"a"=>1,"b"=>2,"c"=>3,"d"=>4,"e"=>5,"f"=>6}
array=["b","a","c","f","z","q"]

hash.default = "invalid"
p hash.values_at(*array)  #compact is superfluous

# => [2, 1, 3, 6, "invalid", "invalid"]
于 2017-04-18T21:59:47.677 回答
3
array.map do |key|
  hash.fetch key, 'invalid'
end

如果使用一个参数调用 fetch,则如果该键不存在,它将引发错误。但是,可选的第二个参数可以为不存在的键设置自定义返回值。

在 Hash 构造函数中传递或传递默认值的好处hash.default=是哈希本身不会更改,因此如果您将来查找不存在的键,它将按预期返回 nil 而不是“无效”。

于 2017-04-18T22:02:34.830 回答
2

尝试这个:

array.map { |key|
    hash.has_key?(key) ? hash[key] : 'invalid'
}
于 2017-04-18T22:06:05.543 回答