Метод обнаружения Ruby
Выбор имеет смысл. Но может ли кто-нибудь объяснить мне? Я не понимаю этих данных.
>> [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]
Ответы
Ответ 1
Обнаружение возвращает первый элемент в списке, для которого блок возвращает 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.
Ответ 2
обнаружение только возвращает первое значение, которое удовлетворяет предикату, если оно есть, в противном случае. 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
Ответ 3
Документы ruby-это отличный ресурс, когда вы хотите узнать о методах.
Перечислимые # обнаружения
Ответ 4
find
and 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]
Ссылка Ссылка