From: pablodherrero@... Date: 2015-06-12T15:46:47+00:00 Subject: [ruby-core:69555] [Ruby trunk - Feature #9108] Hash sub-selections Issue #9108 has been updated by Pablo Herrero. Since Hash#slice wouldn't really play well polymorphically with Array#slice, and it feels (to me at lest) a bit odd to have have Hash#select returning an enumerator if the parameter is an array while Enumerable#select would fail on that scenario, why don't go with the idea of proposing a new selector altogether like Hash#only (and maybe Hash#except)?. ---------------------------------------- Feature #9108: Hash sub-selections https://bugs.ruby-lang.org/issues/9108#change-52889 * Author: Tom Wardrop * Status: Open * Priority: Normal * Assignee: Yukihiro Matsumoto ---------------------------------------- Hi, I seem to regularly have the requirement to work on a sub-set of key/value pairs within a hash. Ruby doesn't seem to provide a concise means of selecting a sub-set of keys from a hash. To give an example of what I mean, including how I currently achieve this: ```ruby sounds = {dog: 'woof', cat: 'meow', mouse: 'squeak', horse: 'nay', cow: 'moo'} domestic_sounds = sounds.select { |k,v| [:dog, :cat].include? k } #=> {dog: 'woof', cat: 'meow'} ``` I think a more concise and graceful solution to this would be to allow the Hash#[] method to take multiple arguments, returning a sub-hash, e.g. ```ruby domestic_sounds = sounds[:dog, :cat] #=> {dog: 'woof', cat: 'meow'} ``` I had a requirement in the current project I'm working on to concatenate two values in a hash. If this proposed feature existed, I could of just done this... ```ruby sounds[:dog, :cat].values.join #=> 'woofmeow' ``` You could do something similar for the setter also... ```ruby sounds[:monkey, :bat] = 'screech' sounds #=> {dog: 'woof', cat: 'meow', mouse: 'squeak', horse: 'nay', cow: 'moo', monkey: 'screech', bat: 'screech'} ``` Concise, convenient and readable. Thoughts? -- https://bugs.ruby-lang.org/