这两个语句给予了相同的结果:
[1,2,3,4].find_all { |x| x.even? } [1,2,3,4].select{ |x| x.even? }
find_all仅仅是一个别名吗?有没有理由使用一个而不是另一个?
find_all
ghg1uchk1#
#find_all和#select非常相似;这两种方法的区别是非常细微的。2在大多数情况下,它们是等价的。3这取决于实现它的类。Enumerable#find_all和Enumerable#select在相同的程式码上执行。Array和Range也是如此,因为它们使用Enumerable实现。对于Hash,#select被重新定义为返回Hash而不是Array,但#find_all继承自Enumerable
#find_all
#select
Enumerable#find_all
Enumerable#select
Array
Range
Enumerable
Hash
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]]
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。
select
Hash#select
true
Array#select
Range#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]
vdzxcuhz3#
是的,对于数组,它们返回相同的结果。对于其他东西(例如哈希),它们可能返回不同的结果。根据select和find_all的Enumerable文档,这两个方法都指向相同的源代码,并且都返回Array(如果给定了块)或Enumerator(如果没有给定块)。虽然Array类实现了它自己的select版本(但让Enumerable处理find_all),但它们仍然执行相同的操作。
lawou6xi4#
如果使用数组,则将结果作为数组返回使用散列,它将结果作为数组返回
如果使用数组,则将结果作为数组返回使用hash,它将结果作为hash返回
4条答案
按热度按时间ghg1uchk1#
#find_all
和#select
非常相似;这两种方法的区别是非常细微的。2在大多数情况下,它们是等价的。3这取决于实现它的类。Enumerable#find_all
和Enumerable#select
在相同的程式码上执行。Array
和Range
也是如此,因为它们使用Enumerable
实现。对于
Hash
,#select
被重新定义为返回Hash而不是Array,但#find_all
继承自Enumerable
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
。下面是一个完整的演示与例子,支持我的解释上面:
vdzxcuhz3#
是的,对于数组,它们返回相同的结果。对于其他东西(例如哈希),它们可能返回不同的结果。
根据select和find_all的Enumerable文档,这两个方法都指向相同的源代码,并且都返回Array(如果给定了块)或Enumerator(如果没有给定块)。
虽然Array类实现了它自己的
select
版本(但让Enumerable处理find_all
),但它们仍然执行相同的操作。lawou6xi4#
#查找全部
如果使用数组,则将结果作为数组返回
使用散列,它将结果作为数组返回
选择
如果使用数组,则将结果作为数组返回
使用hash,它将结果作为hash返回