我有这个哈希和这个数组,并执行以下命令......
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”=>“无效”,“h”=>“无效”)。 ..)?
答案 0 :(得分: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"]
答案 1 :(得分:3)
array.map do |key|
hash.fetch key, 'invalid'
end
如果使用一个参数调用fetch,那么如果该键不存在则会引发错误。但是,可选的第二个参数可以为不存在的键设置自定义返回值。
这超过hash.default=
或在Hash构造函数中传递默认值的好处是散列本身没有改变,所以如果你以后查找一个不存在的键,它将按预期返回nil而不是'invalid ”。
答案 2 :(得分:2)
试试这个:
array.map { |key|
hash.has_key?(key) ? hash[key] : 'invalid'
}