Ruby array each_slice_with_index?
Если у меня есть arr = [1, 2, 3, 4]
, я знаю, что могу сделать следующее...
> arr.each_slice(2) { |a, b| puts "#{a}, #{b}" }
1, 2
3, 4
... и...
> arr.each_with_index { |x, i| puts "#{i} - #{x}" }
0 - 1
1 - 2
2 - 3
3 - 4
... Но есть ли способ сделать это?
> arr.each_slice_with_index(2) { |i, a, b| puts "#{i} - #{a}, #{b}" }
0 - 1, 2
2 - 3, 4
Я знаю, что могу построить свою собственную и вставить ее в метод массива. Просто посмотрите, есть ли встроенная функция для этого.
Ответы
Ответ 1
Как и большинство методов итератора, each_slice
возвращает перечислимый при вызове без блока с ruby 1.8.7+, который вы можете вызвать далее перечисляемые методы. Итак, вы можете сделать:
arr.each_slice(2).with_index { |(a, b), i| puts "#{i} - #{a}, #{b}" }
Ответ 2
arr.each_slice(2).with_index { |(*a), i| ...
также обратите внимание, что массив, первый параметр блока, может быть * arr
Ответ 3
В 1.9 много методов возвращает перечислитель, если блок не предоставляется. Вы можете вызвать другой метод в счетчике.
arr = [1, 2, 3, 4, 5, 6, 7, 8]
arr.each_with_index.each_slice(2){|(a,i), (b,j)| puts "#{i} - #{a}, #{b}"}
(Изменение на @sepp2k). Результат:
0 - 1, 2
2 - 3, 4
4 - 5, 6
6 - 7, 8