# Hash#\[\]

**URL:** <https://www.ruby-forum.com/t/hash/95734>\
**Category:** Ruby\
**Created:** [June 11, 2006, 1:46pm UTC](https://www.ruby-forum.com/t/hash/95734 "2006-06-11T13:46:55Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![dasch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b2d939/32.png) [@dasch](https://www.ruby-forum.com/u/dasch)\
**Post date:** [June 11, 2006, 1:46pm UTC](https://www.ruby-forum.com/t/hash/95734/1 "2006-06-11T13:46:55Z")

</div>

Am I the only one who thinks this would be a natural behavior for  
Hash#[]?

hsh = {:foo =\> ‘FOO’, :bar =\> ‘BAR’, :baz =\> ‘BAZ’}  
hsh[:foo] #=\> “FOO”  
hsh[:foo, :baz] #=\> [“FOO”, “BAZ”]

That would enable us to do the following

def initialize(opts = {})  
@host, @user, @pass = opts[:host, :user, :pass]  
end

Since the old functionality isn’t changed, it would be backwards  
compatible.

Implementation:

class Hash  
def   
if keys.length == 1  
fetch(keys.first, nil)  
else  
keys.map{|key| fetch(key, nil)}  
end  
end  
end

Cheers,  
Daniel

---

<div class="post-metadata">

**Author:** ![dasch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b2d939/32.png) [@dasch](https://www.ruby-forum.com/u/dasch)\
**Post date:** [June 11, 2006, 2:02pm UTC](https://www.ruby-forum.com/t/hash/95734/2 "2006-06-11T14:02:26Z")

</div>

Daniel S. wrote:

> class Hash  
> def   
> if keys.length == 1  
> fetch(keys.first, nil)  
> else  
> keys.map{|key| fetch(key, nil)}  
> end  
> end  
> end

The implementation needs a little update:

class Hash  
def   
if keys.length == 1  
fetch(keys.first, default(keys.first))  
else  
keys.map{|key| fetch(key, default(key))}  
end  
end  
end

That should take care of default values and such.

Daniel

---

<div class="post-metadata">

**Author:** ![dasch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b2d939/32.png) [@dasch](https://www.ruby-forum.com/u/dasch)\
**Post date:** [June 11, 2006, 2:20pm UTC](https://www.ruby-forum.com/t/hash/95734/3 "2006-06-11T14:20:53Z")

</div>

Daniel S. wrote:

> class Hash  
> def   
> if keys.length == 1  
> fetch(keys.first, default(keys.first))  
> else  
> keys.map{|key| fetch(key, default(key))}  
> end  
> end  
> end

This was much simpler in my head…

class Hash  
def   
if keys.length == 1  
fetch(keys.first) rescue default(keys.first)  
else  
keys.map{|key| fetch(key) rescue default(key)}  
end  
end  
end

Daniel

---

<div class="post-metadata">

**Author:** ![dasch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b2d939/32.png) [@dasch](https://www.ruby-forum.com/u/dasch)\
**Post date:** [June 11, 2006, 2:27pm UTC](https://www.ruby-forum.com/t/hash/95734/4 "2006-06-11T14:27:16Z")

</div>

Hash#values\_at does what I want. Never mind.

!#%¤#!"%(§%§§“¤/”%/(!!!

Daniel

---

<div class="post-metadata">

**Author:** ![dasch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b2d939/32.png) [@dasch](https://www.ruby-forum.com/u/dasch)\
**Post date:** [June 11, 2006, 2:30pm UTC](https://www.ruby-forum.com/t/hash/95734/5 "2006-06-11T14:30:29Z")

</div>

Seems not too bad. Or am I missing something?

---

<div class="post-metadata">

**Author:** ![dasch](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b2d939/32.png) [@dasch](https://www.ruby-forum.com/u/dasch)\
**Post date:** [June 11, 2006, 2:36pm UTC](https://www.ruby-forum.com/t/hash/95734/6 "2006-06-11T14:36:29Z")

</div>

On 6/11/06, Daniel S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Am I the only one who thinks this would be a natural behavior for Hash#[]?
> 
> hsh = {:foo =\> ‘FOO’, :bar =\> ‘BAR’, :baz =\> ‘BAZ’}  
> hsh[:foo] #=\> “FOO”  
> hsh[:foo, :baz] #=\> [“FOO”, “BAZ”]

No, you’re not. However, there is Hash#values\_at() which already does  
the same thing.  
(Can anyone remind me why Hash#[] doesn’t allow \*args?)

Regards,  
Sean
