Ruby Detect method
Select makes sense. But can someone explain .detect to me? I don't understand these data.
>> [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,开发者_JAVA技巧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]
Detect returns the first item in the list for which the block returns TRUE. Your first example:
>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,4) }
=> 3
Returns 3
because that is the first item in the list that returns TRUE for the expression x.between?(3,4)
.
detect
stops iterating after the condition returns true for the first time. select
will iterate until the end of the input list is reached and returns all of the items where the block returned true.
detect just returns the first value that satisfies the predicate, if any, nil otherwise. select
returns all the values that satisfy the predicate. a.detect { p }
is analogous to 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
The ruby-docs are a great ressource when you want to learn about the methods.
Enumerable#detect
find
and detect
will always either return a single object or they will return nil
if nothing is matched:
[1,2,3,4,5,6,7].detect { |x| x.between?(1,7) }
=> 1
find_all
and select
will return an array of things that it finds that match:
[1,2,3,4,5,6,7].select { |x| x.between?(1,7) }
=> [1, 2, 3, 4, 5, 6, 7]
Reference Link
精彩评论