Подтвердить что ты не робот

Метод обнаружения 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]
4b9b3361

Ответ 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

Ответ 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]

Ссылка Ссылка