39

选择是有道理的。但是有人可以向我解释 .detect 吗?我不明白这些数据。

>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,4) }
=> 3
>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,6) }
=> 3
>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,7) }
=> 3
>> [1,2,3,4,5,6,7].detect { |x| x.between?(2,7) }
=> 2
>> [1,2,3,4,5,6,7].detect { |x| x.between?(1,7) }
=> 1
>> [1,2,3,4,5,6,7].detect { |x| x.between?(6,7) }
=> 6
>> [1,2,3,4,5,6,7].select { |x| x.between?(6,7) }
=> [6, 7]
>> [1,2,3,4,5,6,7].select { |x| x.between?(1,7) }
=> [1, 2, 3, 4, 5, 6, 7]
4

4 回答 4

81

检测返回列表中块返回 TRUE 的第一个项目。你的第一个例子:

>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,4) }
=> 3

返回3,因为这是列表中为表达式返回 TRUE 的第一项x.between?(3,4)

detect在条件第一次返回 true 后停止迭代。select将迭代直到到达输入列表的末尾并返回块返回 true 的所有项目。

于 2010-06-07T03:00:35.040 回答
11

检测只返回满足谓词的第一个值,如果有,则返回 nil 。select返回满足谓词的所有值。a.detect { p }类似于a.select { p }[0]

 irb(main):001:0> [1,2,3].detect { true }
 => 1
 irb(main):002:0> [1,2,3].detect { false }
 => nil
 irb(main):003:0> [1,2,3].detect { |x| x % 2 == 0 }
 => 2
于 2010-06-07T03:04:43.960 回答
5

当您想了解这些方法时,ruby-docs 是一个很好的资源。

可枚举#detect

于 2010-06-07T03:05:36.253 回答
4

find并且detect将始终返回单个对象,或者nil如果没有匹配,它们将返回:

[1,2,3,4,5,6,7].detect { |x| x.between?(1,7) }
=> 1

find_all并将select返回一个它找到匹配的东西的数组:

[1,2,3,4,5,6,7].select { |x| x.between?(1,7) }
=> [1, 2, 3, 4, 5, 6, 7]

参考链接

于 2016-03-29T00:58:31.047 回答