Robert Klemme
11/30/2007 8:26:00 AM
2007/11/30, MonkeeSage <MonkeeSage@gmail.com>:
> On Nov 29, 4:35 am, Robert Klemme <shortcut...@googlemail.com> wrote:
> > 2007/11/28, MonkeeSage <MonkeeS...@gmail.com>:
> >
> >
> >
> > > On Nov 28, 1:47 pm, Andrew Stone <stoneli...@gmail.com> wrote:
> > > > Note: parts of this message were removed by the gateway to make it a legal Usenet post.
> >
> > > > 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
> >
> > > > --
> > > > Andrew Stone
> >
> > > You can always wrap delete_if...
> >
> > > 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
>
> Nice. :)
>
> > 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. :-)
>
> 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
--
use.inject do |as, often| as.you_can - without end