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
On Nov 28, 1:47 pm, Andrew S. [email protected] 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
2007/11/28, MonkeeSage [email protected]:
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
2007/11/30, MonkeeSage [email protected]:
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
On Nov 29, 4:35 am, Robert K. [email protected] 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! 