I often need a method to extract "subhashes" from hashes. I often monkey-patched this into hash and found "extract" to be a good name for the method. Afterwards I found out that there actually is a mutating method called "extract!" in ActiveSupport, so I guess the name is kinda established. Here's the Ruby version from my private extension library, if there's any interest in this I would try to re-implement it in C:
class Hash
def extract(*ks)
existing = keys & ks
Hash[existing.zip(values_at(*existing))]
end
end
Author: citizen428 (Michael Kohl)
Status: Open
Priority: Normal
Assignee:
Category: core
Target version:
I often need a method to extract "subhashes" from hashes. I often
monkey-patched this into hash and found "extract" to be a good name for the
method. Afterwards I found out that there actually is a mutating method
called "extract!" in ActiveSupport, so I guess the name is kinda
established. Here's the Ruby version from my private extension library, if
there's any interest in this I would try to re-implement it in C:
class Hash
def extract(*ks)
existing = keys & ks
Hash[existing.zip(values_at(*existing))]
end
end
Isn't that like the method slice in ActiveSupport?
It's definitely like extract! in ActiveSupport, just non-destructive. I still think this is useful enough to be in core though. I needed it repeatedly, I know other people who regularly monkey-patch it into Hash and not everyone wants to drag ActiveSupport into their non-Rails projects. I don't insist on it of course, but it wouldn't be the first thing to make it from an extensions library into core, think of Symbol#to_proc for example.
It's definitely like extract! in ActiveSupport, just non-destructive.
There is no "extract!" in ActiveSupport, its "slice!" you mean.
So yeah, I've used that before, and would be nice in core. I think it
should be called 'slice' instead of 'extract'. It's a better name and it
already exists like that in ActiveSupport and in Facets...
It important to understand the differences and to determine the best definition. ActiveSupport's #slice returns the same type of class, which I think is important, where as #extract! always returns a Hash. Also, #slice and #slice! are provided, where as there is only #extract! in ActiveSupport. Certainly we want both. ActiveSupport's #slice also has a special feature for #convert_key, which I think that would be nice for Ruby to have too, but it is not part of Ruby at this time. So that would obviously be omitted.
I concur with Clay that #slice is the better name b/c Array#[] and Array#slice are pretty much the same, and though it might be a little bit more different that general relationship should also hold for Hash.
Oh my, what a disaster. I wonder who made the crazy decision that hash
slice would returned a slice of the hash and slice! would return... the
receiver and not the slice of the hash. Especially since Array slice and
slice! return the same values...
So, sorry Michael, I was confused. Anyways, I think the most important is slice and that's the correct name too, and it might be nice to have a
mutating version too. I'd name it slice! and too bad for ActiveRecord, but
that might not be the best way to go.