Hash.clear("value")

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

Regards,
Jordan

···

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

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. :slight_smile:

Kind regards

robert

···

2007/11/28, MonkeeSage <MonkeeSage@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

--
use.inject do |as, often| as.you_can - without end

> > 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. :slight_smile:

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. :slight_smile:

Yes, but we're lazy! :wink: No blocks here! Heh. Otherwise we would just
use delete_if! :wink:

···

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:

Kind regards

robert

--
use.inject do |as, often| as.you_can - without end

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

···

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. :slight_smile:

> 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. :slight_smile:

Yes, but we're lazy! :wink: No blocks here! Heh. Otherwise we would just
use delete_if! :wink:

--
use.inject do |as, often| as.you_can - without end