Рубиновый массив 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

Я знаю, что могу создать свой собственный и вставить его в метод массива. Просто смотрю, есть ли встроенная функция для этого.


person Drew    schedule 12.05.2011    source источник


Ответы (3)


Как и большинство методов итераторов, each_slice возвращает перечисляемое значение при вызове без блока, начиная с ruby ​​1.8.7+, для которого затем можно вызывать дополнительные перечисляемые методы. Итак, вы можете сделать:

arr.each_slice(2).with_index { |(a, b), i| puts "#{i} - #{a}, #{b}" }
person sepp2k    schedule 12.05.2011
comment
Очень круто! Просто, чтобы завершить мою первоначальную проблему, мне нужно было бы сделать #{i*2}, чтобы получить индекс в исходном обработчике, а не индекс в нарезанном перечислении. - person Drew; 13.05.2011

arr.each_slice(2).with_index { |(*a), i| ...

также обратите внимание, что массив, первый параметр блока, может быть *arr

person mekdigital    schedule 13.02.2012

В версии 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
person steenslag    schedule 12.05.2011