ruby “find_all”和“select”是一回事吗?

quhf5bfb  于 2022-11-04  发布在  Ruby
关注(0)|答案(4)|浏览(184)

这两个语句给予了相同的结果:

[1,2,3,4].find_all { |x| x.even? }

[1,2,3,4].select{ |x| x.even? }

find_all仅仅是一个别名吗?有没有理由使用一个而不是另一个?

ghg1uchk

ghg1uchk1#

#find_all#select非常相似;这两种方法的区别是非常细微的。2在大多数情况下,它们是等价的。3这取决于实现它的类。
Enumerable#find_allEnumerable#select在相同的程式码上执行。
ArrayRange也是如此,因为它们使用Enumerable实现。
对于Hash#select被重新定义为返回Hash而不是Array,但#find_all继承自Enumerable

a = [1, 2, 3, 4, 5, 6]
h = {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6}

a.select{|x| x.even?}       # => [2, 4, 6]
a.find_all{|x| x.even?}     # => [2, 4, 6]

h.select{|k,v| v.even?}     # => {:b=>2, :d=>4, :f=>6}
h.find_all{|k,v| v.even?}   # => [[:b, 2], [:d, 4], [:f, 6]]
nlejzf6q

nlejzf6q2#

Enumerable#find_all* 返回一个数组,该数组包含枚举的所有元素,对于该枚举,给定的块将返回一个真值 ,而对于select则不是这样。如果调用#select方法的接收方没有自己的#select方法,则Enumerable#select将返回Array。否则,如果调用#select方法的接收方没有自己的#select方法,则Enumerable#select将返回Array。它将在处理阻塞条件之后返回类似类型的接收器。
Like Hash#select
返回一个新的散列值,其中包含块返回true* 和Array#select的条目。* 返回一个新数组,其中包含给定块返回真值的ary的所有元素。* 现在Range#select将返回一个Array,因为Range类没有它自己的示例方法#select。作为一个Enumerable,它将调用Enumerable#select

rng = (1..4)
ary = [1,2]
hsh = {:a => 1}

rng.method(:select) # => #<Method: Range(Enumerable)#select>
hsh.method(:select) # => #<Method: Hash#select>
ary.method(:select) # => #<Method: Array#select>

下面是一个完整的演示与例子,支持我的解释上面:

hsh = {:a => 2, :b => 3 }
ary = [1,2,3]
rng = (1..3)

# Look find_all always gives Array.

hsh.find_all{ true } # => [[:a, 2], [:b, 3]]
ary.find_all{ true } # => [1, 2, 3]
rng.find_all{ true } # => [1, 2, 3]

# Look select not giving Array always, explanation of why so is written

# above in my answer.

hsh.select{ true } # => {:a=>2, :b=>3}
ary.select{ true } # => [1, 2, 3]
rng.select{ true } # => [1, 2, 3]
vdzxcuhz

vdzxcuhz3#

是的,对于数组,它们返回相同的结果。对于其他东西(例如哈希),它们可能返回不同的结果。
根据select和find_all的Enumerable文档,这两个方法都指向相同的源代码,并且都返回Array(如果给定了块)或Enumerator(如果没有给定块)。
虽然Array类实现了它自己的select版本(但让Enumerable处理find_all),但它们仍然执行相同的操作。

lawou6xi

lawou6xi4#

#查找全部

如果使用数组,则将结果作为数组返回
使用散列,它将结果作为数组返回

选择

如果使用数组,则将结果作为数组返回
使用hash,它将结果作为hash返回

相关问题