a = [1,2,3,4,5,6]
asize = a.size
#=> 6
a.each_index.map { |i| a[i, [4, asize-i].min] }
#=> [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6], [5, 6], [6]]
шаги заключаются в следующем.
asize = a.size
#=> 6
enum0 = a.each_index
#=> #<Enumerator: [1, 2, 3, 4, 5, 6]:each_index>
enum1 = enum0.map
#=> #<Enumerator: #<Enumerator: [1, 2, 3, 4, 5, 6]:each_index>:map>
внимательно посмотреть на возвращаемое значение enum.map
. Вы увидите, что его можно рассматривать как составной перечислитель.
Элементы, которые будут сгенерированы enum1
, преобразуем его в массив.
enum1.to_a
#=> [0, 1, 2, 3, 4, 5]
Теперь мы можем пройти каждый элемент, генерируемый enum1
к блоку для отображения.
i = enum1.next
#=> 0
a[i, [4, asize-i].min]
#=> a[0, [4, 6].min]
#=> a[0, 4]
#=> [1,2,3,4]
поэтому первый элемент a
, 1
, отображается на [1,2,3,4]
.
Остальные шаги заключаются в следующем.
i = enum1.next #=> 1
a[i, [4, asize-i].min] #=> [2, 3, 4, 5]
i = enum1.next #=> 2
a[i, [4, asize-i].min] #=> [3, 4, 5, 6]
i = enum1.next #=> 3
a[i, [4, asize-i].min] #=> [4, 5, 6]
i = enum1.next #=> 4
a[i, [4, asize-i].min] #=> [5, 6]
i = enum1.next #=> 5
a[i, [4, asize-i].min] #=> [6]
i = enum1.next #=> StopIteration: iteration reached an end
большое спасибо @mudasobwa. Я задаю вопрос о методе уровня 2 'array.map.with_index'. Как он обрабатывается? –
'a.each_index.map' более прост. – sawa
или '{| _, i | a [i..i + 4]} ', без' slice' – Ilya