# Hash.clear("value")

**URL:** <https://www.ruby-forum.com/t/hash-clear-value/121547>\
**Category:** Ruby\
**Created:** [November 28, 2007, 8:48pm UTC](https://www.ruby-forum.com/t/hash-clear-value/121547 "2007-11-28T20:48:28Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![starmaerker](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9bcb4/32.png) [@starmaerker](https://www.ruby-forum.com/u/starmaerker)\
**Post date:** [November 28, 2007, 8:48pm UTC](https://www.ruby-forum.com/t/hash-clear-value/121547/1 "2007-11-28T20:48:28Z")

</div>

Hello all,

Was just wondering if there was something simple like:

hash.clear(“value”)

This would remove all entries from the hash whose value == “value”.

Yeah, I know about delete\_if, this would just be more succinct. I can  
be  
lazy sometimes.

thanks,  
andy

---

<div class="post-metadata">

**Author:** ![starmaerker](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9bcb4/32.png) [@starmaerker](https://www.ruby-forum.com/u/starmaerker)\
**Post date:** [November 28, 2007, 9:10pm UTC](https://www.ruby-forum.com/t/hash-clear-value/121547/2 "2007-11-28T21:10:43Z")

</div>

On Nov 28, 1:47 pm, Andrew S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Yeah, I know about delete\_if, this would just be more succinct. I can be  
> lazy sometimes.
> 
> thanks,  
> andy
> 
> –  
> Andrew S.

You can always wrap delete\_if…

class Hash  
def remove(target)  
self.delete\_if { | key, value |  
value == target  
}  
end  
end

Regards,  
Jordan

---

<div class="post-metadata">

**Author:** ![starmaerker](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9bcb4/32.png) [@starmaerker](https://www.ruby-forum.com/u/starmaerker)\
**Post date:** [November 29, 2007, 11:35am UTC](https://www.ruby-forum.com/t/hash-clear-value/121547/3 "2007-11-29T11:35:47Z")

</div>

2007/11/28, MonkeeSage [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > 
> 
> class Hash  
> def remove(target)  
> self.delete\_if { | key, value |  
> value == target  
> }  
> end  
> end

Just a subtle point: IMHO it is better to put “target” on the left  
side of the comparison because that gives the caller more control on  
the deletion criterion:

class Hash  
def remove(target)  
delete\_if { | key, value |  
target == value  
}  
end  
end

For example, you could do

crit = Object.new  
def crit.==(x) x \< 10 end  
a\_hash.remove crit # remove all entries where value is \< 10

It’s a similar pattern to how “case” does comparison via “===”. But  
then again, this is probably even better:

class Hash  
def remove\_val  
delete\_if {|k,v| yield v}  
self  
end  
end

Because it’s more modular. But then again, you can use delete\_if  
directly. 🙂

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![starmaerker](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9bcb4/32.png) [@starmaerker](https://www.ruby-forum.com/u/starmaerker)\
**Post date:** [November 30, 2007, 9:26am UTC](https://www.ruby-forum.com/t/hash-clear-value/121547/4 "2007-11-30T09:26:22Z")

</div>

2007/11/30, MonkeeSage [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > > > Was just wondering if there was something simple like:
> > 
> > > end  
> > > }
> 
> > Because it’s more modular. But then again, you can use delete\_if directly. 🙂
> 
> Yes, but we’re lazy! 😉 No blocks here! Heh. Otherwise we would just  
> use delete\_if! 😉

Laziness is exactly the reason why I use delete\_if. Why? Because I  
can be sure it’s there. I don’t have to create a lib of my personal  
extensions, require it in every script and make sure it can be found  
via RUBYLIB. Granted, setting RUBYLIB is a one time effort, but  
requiring needs to be done for every script plus I cannot pass scripts  
around as easily; I have to at least shop two files. etc.

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![starmaerker](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/e9bcb4/32.png) [@starmaerker](https://www.ruby-forum.com/u/starmaerker)\
**Post date:** [November 30, 2007, 7:10am UTC](https://www.ruby-forum.com/t/hash-clear-value/121547/5 "2007-11-30T07:10:41Z")

</div>

On Nov 29, 4:35 am, Robert K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > –  
> > > end  
> > > end  
> > > end
> 
> For example, you could do
> 
> crit = Object.new  
> def crit.==(x) x \< 10 end  
> a\_hash.remove crit # remove all entries where value is \< 10

Nice. 🙂

> Because it’s more modular. But then again, you can use delete\_if directly. 🙂  
> Yes, but we’re lazy! 😉 No blocks here! Heh. Otherwise we would just  
> use delete\_if! 😉
