Feature #12461
closedHash & keys to make subset.
Description
It would be nice if Hash had a way to create a sub-hash with a limited set of keys. This would be useful for keyword functions in particular, because sometimes you have a large hash of things and you only want to send a subset to another function.
A definition somewhat like:
class Hash
def &(keys)
keys.each_with_object(self.class.new) {|key, hash| hash[key] = self[key] if has_key?(key)}
end
end
You can see some similar definitions here: https://github.com/rails/rails/blob/b670fadb978c8a12c3414ed842cd49e4fde2cec0/activesupport/lib/active_support/core_ext/hash/slice.rb#L21
It might be nice to support slice and slice! in a similar logical sense to Array rather than proposed & operator above - that would just be nice shortcut.
Updated by ioquatix (Samuel Williams) almost 10 years ago
Just to add to this, I also found an implementation here:
https://github.com/rubyworks/facets/blob/master/lib/core/facets/hash/slice.rb
Now I wonder if this warrants being in the standard library. I believe it probably does since it appears lots of people are using it, and it would probably be significantly faster written in C.
Updated by shyouhei (Shyouhei Urabe) almost 10 years ago
- Related to Feature #8499: Importing Hash#slice, Hash#slice!, Hash#except, and Hash#except! from ActiveSupport added
Updated by matz (Yukihiro Matsumoto) almost 10 years ago
- Status changed from Open to Closed
I am against having Hash#&. Array#& takes two arrays. The proposed Hash#& takes a hash and key array.
if you want Hash#slice to be added to the core, submit a new issue. But note that now we have real
keyword arguments so that we have less need for manipulating keyword hashes explicitly.
Matz.
Updated by usa (Usaku NAKAMURA) over 9 years ago
- Tracker changed from Bug to Feature
- Status changed from Closed to Rejected