grep在Hash上是什么意思?

use*_*980 8 ruby

{'a' => 'b'}.grep /a/
=> []
>> {'a' => 'b'}.grep /b/
=> []
Run Code Online (Sandbox Code Playgroud)

它似乎与键或值不匹配.它做了我不能辨别的事情吗?

Jör*_*tag 12

grep是定义的Enumerable,即它是一个通用的方法,不知道Hashes的任何内容.它可以运行在任何元素上Enumerable.Ruby没有键值对的类型,它只是将Hash条目表示为两元素数组,其中第一个元素是键,第二个元素是值.

grep使用该===方法过滤掉元素.既然都没有

/a/ === ['a', 'b']
Run Code Online (Sandbox Code Playgroud)

也不

/b/ === ['a', 'b']
Run Code Online (Sandbox Code Playgroud)

是的,你总是得到一个空数组作为响应.

试试这个:

def (t = Object.new).===(other)
  true
end

{'a' => 'b'}.grep t
# => [['a', 'b']]
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到如何grep使用Hashes.

  • @ user258980:没有定义`Hash#===`的事实完全无关紧要,因为你没有调用`Hash#===`,你正在调用`Hash#grep`.`Hash#grep`然后调用传递给它的任何对象的`===`方法.在你的例子中,那个对象是`/ a /`,所以`Hash#grep`最终调用`Regexp#===`依次传递每个元素.由于这些元素是双元素数组,并且`Regexp`显然永远不能匹配数组,只有字符串,结果将始终为空. (3认同)