为什么我不能从ruby中的选定键创建新哈希?

ste*_*com 5 ruby hash

这一直困扰着我.这不是一件困难的事情,但我不知道为什么没有简单的方法可以做到这一点,而且我打赌有,而且我没有看到它.

我只想拿一个哈希,像这样:

cars = {:bob => 'Pontiac', :fred => 'Chrysler', 
        :lisa => 'Cadillac', :mary => 'Jaguar'}
Run Code Online (Sandbox Code Playgroud)

并做一些类似的事情

cars[:bob, :lisa]
Run Code Online (Sandbox Code Playgroud)

得到

{:bob => 'Pontiac', :lisa => 'Cadillac'}
Run Code Online (Sandbox Code Playgroud)

我这样做了,效果很好:

class Hash
  def pick(*keys)
    Hash[select { |k, v| keys.include?(k) }]
  end
end

ruby-1.8.7-p249 :008 > cars.pick(:bob, :lisa)
=> {:bob=>"Pontiac", :lisa=>"Cadillac"} 
Run Code Online (Sandbox Code Playgroud)

显然有很多简单的方法可以做到这一点,但我想知道是否有一些内置的东西我错过了,或者一个不明显的原因它不是标准和正常的东西?没有它,我最终会使用类似的东西:

chosen_cars = {:bob => cars[:bob], :lisa => cars[:lisa]}
Run Code Online (Sandbox Code Playgroud)

这不是世界末日,但它不是很漂亮.看起来这应该是常规词汇的一部分.我在这里错过了什么?

(相关问题,包括:Ruby Hash Whitelist Filter)(这篇博文与我的结果完全相同,但同样,为什么不内置这个?http://matthewbass.com/2008/06/26/picking -values-from-ruby-hashes /)

更新:

我正在使用Rails,它有ActiveSupport :: CoreExtensions :: Hash :: Slice,它完全按照我的意愿工作,所以问题解决了,但仍然......也许别人会在这里找到答案:)

ste*_*com 6

在事实发生几年后,只是为了帮助他人:

Slice很好地满足了我的要求。

> cars.slice(:bob, :lisa)
=> {:bob=>"Pontiac", :lisa=>"Cadillac"} 
Run Code Online (Sandbox Code Playgroud)