Arrays 差异检测{}并选择{}[0] 我考虑一下红宝石中这些方法的区别。我知道,select返回一个元素数组,detect只返回一个和第一个consisten元素。但是如果我键入数组,选择{condition}[0],有什么区别吗?它将返回第一个单元,如detect。 例如: a = [2,3,4,5] a.detect{|k| k.even? } # => 2 a.select{|k| k.even? }[0] # => 2

Arrays 差异检测{}并选择{}[0] 我考虑一下红宝石中这些方法的区别。我知道,select返回一个元素数组,detect只返回一个和第一个consisten元素。但是如果我键入数组,选择{condition}[0],有什么区别吗?它将返回第一个单元,如detect。 例如: a = [2,3,4,5] a.detect{|k| k.even? } # => 2 a.select{|k| k.even? }[0] # => 2,arrays,ruby,Arrays,Ruby,任何人都可以向我解释这些方法的其他区别,并举例说明检测优于选择 当您只需要检索一个项时,detect更可取,因为当它找到与条件匹配的第一个匹配项时,它将停止对数组的迭代。由于select检索与条件匹配的所有事件,因此它必须迭代整个列表。在最坏的情况下(与条件匹配的项目不在列表中),它们是等效的,但是如果您要查找的项目在列表的早期detect将更有效 当您只需要检索一个项时,detect更可取,因为当它找到与条件匹配的第一个匹配项时,它将停止对数组的迭代。由于select检索与条件匹配的所有事件,

任何人都可以向我解释这些方法的其他区别,并举例说明
检测
优于
选择

当您只需要检索一个项时,
detect
更可取,因为当它找到与条件匹配的第一个匹配项时,它将停止对数组的迭代。由于
select
检索与条件匹配的所有事件,因此它必须迭代整个列表。在最坏的情况下(与条件匹配的项目不在列表中),它们是等效的,但是如果您要查找的项目在列表的早期
detect
将更有效

当您只需要检索一个项时,
detect
更可取,因为当它找到与条件匹配的第一个匹配项时,它将停止对数组的迭代。由于
select
检索与条件匹配的所有事件,因此它必须迭代整个列表。在最坏的情况下(与条件匹配的项目不在列表中),它们是等效的,但是如果您要查找的项目在列表的早期
detect
将更有效

差异在于
detect
将返回块计算为true的第一个值,在这种情况下,它是数字
2
。如果只需要数组中的一个值,则速度更快,因为在找到一个返回
true
的值后,它不会计算数组的其余部分

select
将根据块返回每个返回
true
的元素,因此它将返回
[2,4]
<代码>选择将为每个元素计算块,因此它比
检测

detect:  0.000000   0.000000   0.000000 (  0.000010)
select:  0.740000   0.010000   0.750000 (  0.753949)
根据您在示例中所做的操作,您只选择
select
返回的第一个元素,最好使用
detect

一个很好的例子是,假设你有一个1000万项的数组,它是从0到100万的随机数

arr = Array.new(1_000_000) { rand(1_000_000) }
如果只想返回第一个偶数,则在此值中使用
检测
将比
选择
快得多。以下是
检测
选择
的基准测量值

detect:  0.000000   0.000000   0.000000 (  0.000010)
select:  0.740000   0.010000   0.750000 (  0.753949)

区别在于
detect
将返回块计算为true的第一个值,在这种情况下,它是数字
2
。如果只需要数组中的一个值,则速度更快,因为在找到一个返回
true
的值后,它不会计算数组的其余部分

select
将根据块返回每个返回
true
的元素,因此它将返回
[2,4]
<代码>选择将为每个元素计算块,因此它比
检测

detect:  0.000000   0.000000   0.000000 (  0.000010)
select:  0.740000   0.010000   0.750000 (  0.753949)
根据您在示例中所做的操作,您只选择
select
返回的第一个元素,最好使用
detect

一个很好的例子是,假设你有一个1000万项的数组,它是从0到100万的随机数

arr = Array.new(1_000_000) { rand(1_000_000) }
如果只想返回第一个偶数,则在此值中使用
检测
将比
选择
快得多。以下是
检测
选择
的基准测量值

detect:  0.000000   0.000000   0.000000 (  0.000010)
select:  0.740000   0.010000   0.750000 (  0.753949)

我想在这里发布一个例子,IMHO澄清了一切:

(1..Float::INFINITY).detect &:odd?
#⇒ 1
(1..Float::INFINITY).select(&:odd?).first
#⇒ :(

我想在这里发布一个例子,IMHO澄清了一切:

(1..Float::INFINITY).detect &:odd?
#⇒ 1
(1..Float::INFINITY).select(&:odd?).first
#⇒ :(

(1..Float::INFINITY).惰性.选择(&:odd?).首先
;-)@Stefan在纯ruby中实现了另一个
detect
:)<代码>(1..Float::INFINITY)。懒惰。选择(&:odd?)。首先;-)@Stefan在纯ruby中实现了另一个
detect
:)同样
a.detect{k|pk;k.een?}
将有不同的输出到
a.select{k|pk;k.een?}[0]
a.detect{k|pk;k.een?
将有不同的输出到
a.select{k{k | pk k;k.een?}[0]
一个更好的例子是
选择
检测
可枚举
的方法,而且
可枚举
不仅允许非常大(如您的示例),甚至是无限大!更好的例子是
select
detect
Enumerable
的方法,而且
Enumerable
不仅允许非常大(如您的示例),甚至可以无限大!