这是什么一个简短的版本?:
from = hash.fetch(:from) to = hash.fetch(:to) name = hash.fetch(:name) # etc
注意fetch,如果键不存在,我想引发一个错误。一定有更短的版本,例如:
fetch
from, to, name = hash.fetch(:from, :to, :name) # <-- imaginary won't work
如果需要,可以使用ActiveSupport。
g6baxovj1#
使用Hash的values_at方法:
values_at
from, to, name = hash.values_at(:from, :to, :name)
对于散列中不存在的任何键,这将返回nil。
nil
8ehkhllq2#
Ruby2.3最后引入了fetch_values方法,可以直接实现这一点:
fetch_values
{a: 1, b: 2}.fetch_values(:a, :b) # => [1, 2] {a: 1, b: 2}.fetch_values(:a, :c) # => KeyError: key not found: :c
velaa5lx3#
hash = {from: :foo, to: :bar, name: :buz} [:from, :to, :name].map{|sym| hash.fetch(sym)} # => [:foo, :bar, :buz] [:frog, :to, :name].map{|sym| hash.fetch(sym)} # => KeyError
mu0hgdu04#
my_array = {from: 'Jamaica', to: 'St. Martin'}.values_at(:from, :to, :name) my_array.keys.any? {|key| element.nil?} && raise || my_array
这将引发您请求的错误
my_array = {from: 'Jamaica', to: 'St. Martin', name: 'George'}.values_at(:from, :to, :name) my_array.keys.any? {|key| element.nil?} && raise || my_array
这将返回数组。但是OP要求在丢失的钥匙上失败...
class MissingKeyError < StandardError end my_hash = {from: 'Jamaica', to: 'St. Martin', name: 'George'} my_array = my_hash.values_at(:from, :to, :name) my_hash.keys.to_a == [:from, :to, :name] or raise MissingKeyError my_hash = {from: 'Jamaica', to: 'St. Martin'} my_array = my_hash.values_at(:from, :to, :name) my_hash.keys.to_a == [:from, :to, :name] or raise MissingKeyError
jobtbby35#
你可以用KeyError对象的默认值初始化你的哈希值。如果你试图获取的键不存在,这将返回一个KeyError的示例。你需要做的就是检查它的(值的)类,如果它是KeyError,就引发它。
KeyError
hash = Hash.new(KeyError.new("key not found"))
让我们向该哈希添加一些数据
hash[:a], hash[:b], hash[:c] = "Foo", "Bar", nil
最后查看值,如果未找到键,则引发错误
hash.values_at(:a,:b,:c,:d).each {|v| raise v if v.class == KeyError}
当且仅当key不存在时,这会引发异常。如果你有一个值为nil的key,它不会抱怨。
rjee0c156#
最简单的方法就是
from, to, name = [:from, :to, :name].map {|key| hash.fetch(key)}
或者,如果要使用values_at,可以使用带有默认值块的Hash:
Hash
hash=Hash.new {|h, k| raise KeyError.new("key not found: #{k.inspect}") } # ... populate hash from, to, name = hash.values_at(:from, :to, :name) # raises KeyError on missing key
或者,如果你这么想,猴子补丁Hash
class ::Hash def fetch_all(*args) args.map {|key| fetch(key)} end end from, to, name = hash.fetch_all :from, :to, :name
lo8azlld7#
模式匹配是Ruby 2.7中的一个实验性特性。
hash = { from: 'me', to: 'you', name: 'experimental ruby' } hash in { from:, to:, name: }
请参阅https://rubyreferences.github.io/rubyref/language/pattern-matching.html
oyt4ldly8#
我需要返回一个哈希值,所以我做了一个补丁:
class Hash def multi_fetch(*keys) keys.map { |key| [key, fetch(key)] }.to_h end end
8条答案
按热度按时间g6baxovj1#
使用Hash的
values_at
方法:对于散列中不存在的任何键,这将返回
nil
。8ehkhllq2#
Ruby2.3最后引入了
fetch_values
方法,可以直接实现这一点:velaa5lx3#
mu0hgdu04#
这将引发您请求的错误
这将返回数组。
但是OP要求在丢失的钥匙上失败...
jobtbby35#
你可以用
KeyError
对象的默认值初始化你的哈希值。如果你试图获取的键不存在,这将返回一个KeyError的示例。你需要做的就是检查它的(值的)类,如果它是KeyError,就引发它。让我们向该哈希添加一些数据
最后查看值,如果未找到键,则引发错误
当且仅当key不存在时,这会引发异常。如果你有一个值为
nil
的key,它不会抱怨。rjee0c156#
最简单的方法就是
或者,如果要使用
values_at
,可以使用带有默认值块的Hash
:或者,如果你这么想,猴子补丁
Hash
lo8azlld7#
模式匹配是Ruby 2.7中的一个实验性特性。
请参阅https://rubyreferences.github.io/rubyref/language/pattern-matching.html
oyt4ldly8#
我需要返回一个哈希值,所以我做了一个补丁: