如何一次获取多个哈希值?

Dmy*_*iak 51 ruby hash ruby-on-rails destructuring

什么是更短的版本?:

from = hash.fetch(:from)
to = hash.fetch(:to)
name = hash.fetch(:name)
# etc
Run Code Online (Sandbox Code Playgroud)

请注意fetch,如果密钥不存在,我想引发错误.

必须有更短的版本,例如:

from, to, name = hash.fetch(:from, :to, :name) # <-- imaginary won't work
Run Code Online (Sandbox Code Playgroud)

如果需要,可以使用ActiveSupport.

Dyl*_*kow 96

使用Hash的values_at方法:

from, to, name = hash.values_at(:from, :to, :name)
Run Code Online (Sandbox Code Playgroud)

这将返回nil散列中不存在的任何键.

  • 这不符合OP的要求. (7认同)
  • @MichaelSzyndel"为什么坚持在这里提出例外" - 因为必须存在关键."当应该引发异常时 - 当密钥不存在时(它可能会为其他密钥留下未分配的变量)" - 是的,如果正常的"获取"也会留下未分配的变量. (3认同)

mat*_*uck 27

Ruby 2.3最后介绍了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
Run Code Online (Sandbox Code Playgroud)


saw*_*awa 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
Run Code Online (Sandbox Code Playgroud)