Enumerable#find
/#detect
的文档说:
find(ifnone = nil) { |obj| block } → obj or nil
find(ifnone = nil) → an_enumerator
将 enum 中的每个条目传递给 block。**返回第一个不为false的block。如果没有对象匹配,则调用 ifnone 并在指定时返回其结果,否则返回nil
。
但是,当在Hash上调用它时,结果将类型更改为Array而不是原始Hash。
这是一些实现错误还是关于这个数据类型的一些历史约定?
{a: 'a', b:'b'}.find {|k, v| v == 'b'}
# => [:b, 'b']
4条答案
按热度按时间vlju58qv1#
Hash#detect
继承自Enumerable#detect
方法。Enumerable
模块基于包含Enumerable
的类的each
方法生成多个方法(如sort
,min
,max
包括detect
等)。它并不关心
each
是如何实现的,只要它“.产生集合的连续成员。“从ruby-doc
所以对于
Hash#detect
方法,它依赖于Hash#each
的行为,即:对hsh中的每个键调用一次block,并将键值对作为参数传递。如果没有给出块,则返回枚举数。
因为
Hash#each
以两对数组的形式产生哈希,所以从Enumerable
模块继承的所有方法都基于此工作。这就是为什么
Hash#detect
生成一个两个元素的数组,而不是哈希对象本身。iq0todco2#
find
是根据each
实现的。而each
,当在Hash上调用时,以数组的形式返回键值对,每个键值对有2个元素。这就是为什么find
返回一个数组。dgenwo3n3#
使用hash,detect/find将hash中的每个键/值对传递给块,您可以“捕获”为:
要了解更多关于此主题的信息,请查看此处
Enumerating Ruby’s “Enumerable” Module, Part 3: “detect”, a.k.a. “find”Enumerating Ruby’s “Enumerable” Module, Part 3: “detect”, a.k.a. “find”
wswtfjt74#
我可以用这个: