62

これの短いバージョンは何ですか?:

from = hash.fetch(:from)
to = hash.fetch(:to)
name = hash.fetch(:name)
# etc

fetchキーが存在しない場合はエラーを発生させたいことに注意してください。

次のような短いバージョンが必要です。

from, to, name = hash.fetch(:from, :to, :name) # <-- imaginary won't work

必要に応じて ActiveSupport を使用しても構いません。

4

7 に答える 7

112

ハッシュのvalues_at方法を使用します。

from, to, name = hash.values_at(:from, :to, :name)

nilこれは、ハッシュに存在しないキーに対して返されます。

于 2013-07-15T04:14:23.300 に答える
5
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
于 2013-07-15T04:13:28.647 に答える
2
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
于 2013-07-15T04:57:45.573 に答える
1

オブジェクトのデフォルト値でハッシュを初期化できます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}

これは、キーが存在しない場合にのみ例外を発生させます。値を持つキーがある場合、文句はありませんnil

于 2013-07-15T14:37:13.660 に答える
1

私が行く最も簡単なことは

from, to, name = [:from, :to, :name].map {|key| hash.fetch(key)}

または、 を使用する場合は、デフォルト値ブロックで a をvalues_at使用できます。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
于 2013-07-15T05:50:04.853 に答える