How to use Enumerable#grep with Hash object/collection

I used #grep method with Range,Array.

a = ['foo','fish','bar']
a.grep(/f/) # => ["foo", "fish"]
(1..40).grep (6..9) # => [6, 7, 8, 9]

But never with Hash. So today I tired something like below :

h = { "arup" => 100, "banti" => 200, "carry" => 300, "Pood" => 300 }
h.grep(/a/i) # => []

Intention was to collect all key/value which has key, that match a
pattern /a/i. But it didn't worked. With Hash, probably #grep not worked
that way.

Any one can tell me how to use `#grep` with a `Enumerable` like `Hash` ?

···

--
Posted via http://www.ruby-forum.com/.

Well, according to grep (Enumerable) - APIdock

grep(p1) public

Returns an array of every element in enum for which Pattern === element. If the optional block is supplied, each matching element is passed to it, and the block’s result is stored in the output array.

And the elements come from #each, which is Hash#each in this case, so each (Hash) - APIdock

Since that passes the key-value pair, let's see what that looks like:

irb2.1.0> h = { "arup" => 100, "banti" => 200, "carry" => 300, "Pood" => 300 }
#2.1.0 => {"arup"=>100, "banti"=>200, "carry"=>300, "Pood"=>300}
irb2.1.0> h.each {|element| p element}
["arup", 100]
["banti", 200]
["carry", 300]
["Pood", 300]
#2.1.0 => {"arup"=>100, "banti"=>200, "carry"=>300, "Pood"=>300}

So #grep is doing:

  /a/i === ["arup", 100]

I wonder what Regexp#=== does? === (Regexp) - APIdock

===(p1) public
Case Equality—Synonym for Regexp#=~ used in case statements.

OK, =~ (Regexp) - APIdock

But, let's look at what the Pickaxe has to say:

Case Equality—Like Regexp#=~ but accepts nonstring arguments (returning false). Used in case statements.

Ah-HA! Since ["arup",100] is a nonstring argument, so it would return false.

Perhaps you want to do something like:

irb2.1.0> h.select {|k,v| /a/i =~ k}
#2.1.0 => {"arup"=>100, "banti"=>200, "carry"=>300}

-Rob

···

On 2014-Mar-12, at 14:50 , Arup Rakshit <lists@ruby-forum.com> wrote:

I used #grep method with Range,Array.

a = ['foo','fish','bar']
a.grep(/f/) # => ["foo", "fish"]
(1..40).grep (6..9) # => [6, 7, 8, 9]

But never with Hash. So today I tired something like below :

h = { "arup" => 100, "banti" => 200, "carry" => 300, "Pood" => 300 }
h.grep(/a/i) # =>

Intention was to collect all key/value which has key, that match a
pattern /a/i. But it didn't worked. With Hash, probably #grep not worked
that way.

Any one can tell me how to use `#grep` with a `Enumerable` like `Hash` ?

--
Posted via http://www.ruby-forum.com/\.

Rob Biedenharn wrote in post #1139632:

···

On 2014-Mar-12, at 14:50 , Arup Rakshit <lists@ruby-forum.com> wrote:

Perhaps you want to do something like:

irb2.1.0> h.select {|k,v| /a/i =~ k}
#2.1.0 => {"arup"=>100, "banti"=>200, "carry"=>300}

-Rob

Thank you very much.

I am actually looking for any use cases are there or not to use #grep
with Hash, like others. Documentation didn't have any example with Hash.

--
Posted via http://www.ruby-forum.com/\.