Ruby Detect метод - PullRequest
       9

Ruby Detect метод

33 голосов
/ 07 июня 2010

Выбор имеет смысл. Но кто-то может объяснить. Обнаружить меня? Я не понимаю эти данные.

>> [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 ]

73 голосов
/ 07 июня 2010

Detect возвращает первый элемент в списке, для которого блок возвращает 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.

9 голосов
/ 07 июня 2010

detect просто возвращает первое значение, которое удовлетворяет предикату, если оно есть, в противном случае - ноль 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
5 голосов
/ 07 июня 2010

ruby-docs - отличный ресурс, когда вы хотите узнать о методах.

Перечислимые # обнаружение

3 голосов
/ 29 марта 2016

поиск и обнаружение всегда либо возвращают один объект, либо возвращают ноль, если ничего не найдено. например. [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]

Ссылочная ссылка

...