通过传递一组键,使用values_at从Ruby哈希中提取值

Kie*_*cre 1 ruby hash

我试图通过作为参数传入的键提取哈希值:

def menu
  @menu = {"burger" => 5, "chips" => 2, "coke" => 1}
end

def receive_order(*items)
  raise "Sorry not in stock" if items.all? { |key|@menu.has_key?(key) } == false
  :ordered if items.all? { |key|@menu.has_key?(key) }
  # I was hoping to do something like this...
  bill << menu.values_at(items)
  # bill being an empty array
end
Run Code Online (Sandbox Code Playgroud)

我在IRB玩过这个,然后又回来了[nil].有人能解释为什么吗?

如果我输入以下内容:

menu.values_at("burger", "chips")
Run Code Online (Sandbox Code Playgroud)

我明白了:

=> [5,2]
Run Code Online (Sandbox Code Playgroud)

那么为什么作为一个论点传入时它不会起作用?

Jik*_*ose 7

Hash#values_at如果你splat数组而不是传递数组本身将工作.

在张贴例如,该方法values_atHash考虑传递的数组作为一个单一的键,而不是在阵列作为单独的密钥的单个元素.

尝试:

bill << menu.values_at(*items)
Run Code Online (Sandbox Code Playgroud)

REPL(irb/ pry)中的示例:

>> hash = {a: 12, b: 7, c: 23}
=> {:a=>12, :b=>7, :c=>23}
>> keys_to_search = [:a, :b]
=> [:a, :b]
>> hash.values_at keys_to_search
=> [nil]
>> hash.values_at *keys_to_search
=> [12, 7]
Run Code Online (Sandbox Code Playgroud)

  • 你并没有真正传递"啪"的一声."splat"是`*`运算符的通用名称,它将数组"splats"到其元素中.此外,在链接到非Stack Overflow站点时,最好提取并总结您认为重要的页面上的信息.否则,如果该链接中断,您的答案将没有那么多意义或有用. (2认同)