Выбор имеет смысл. Но кто-то может объяснить .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]
Detect возвращает первый элемент в списке, для которого блок возвращает TRUE. Ваш первый пример:
>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,4) }
=> 3
Возвращает 3
, потому что это первый элемент в списке, который возвращает TRUE для выражения x.between?(3,4)
.
detect
прекращает итерацию после того, как условие возвращает истину в первый раз. select
будет выполнять итерацию до тех пор, пока не будет достигнут конец списка ввода, и вернет все элементы, для которых блок вернул true.
ruby-docs - отличный ресурс, если вы хотите узнать о методах.
detect просто возвращает первое значение, удовлетворяющее предикату, если оно есть, иначе 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