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
不仅允许非常大(如您的示例),甚至可以无限大!