Почему это, что:Почему мой блок выполняется только один раз?
array = (1..20).to_a
array.index.each_slice(5) do |slice|
puts slice.inspect
end
возвращается:
[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]
[11, 12, 13, 14, 15]
[16, 17, 18, 19, 20]
в то время как:
other_array = []
array = (1..20).to_a
array.index.each_slice(5) do |slice|
puts slice.inspect
other_array.push(1)
end
возвращается только:
[1, 2, 3, 4, 5]
Как other_array.push(1)
ломает экс устранение блока? Очевидным выводом было бы то, что я не могу получить доступ к переменным, которые не входят в объем блока, но почему это?
Фактически я не вижу смысла в вызове 'index' здесь (что является причиной, а не нажатием массива) – Vasfed
В документации говорится, что' '' index''' «возвращает Enumerator, когда не задан ни блок, ни аргумент», поэтому я назвал '' 'index'''. Я, однако, нуждался в Enumerator, чтобы иметь возможность вызвать each_slice. Только теперь я вижу, что Array включает модуль Enumerable и, следовательно, сам метод each_slice. –
Один из способов взглянуть на это: enum1 = array.index # => #; enum2 = enum1.each_slice (5) # => # : each_slice (5)> '. Внимательно изучите это возвращаемое значение. Вы можете думать о 'enum2' как о« составном »перечислителе. Мы можем видеть элементы, генерируемые 'enum2', путем преобразования его в массив:' enum2.to_a # => [[1, ... 5], ... [16, ... 20]] '. Затем 'enum2.each {| slice | puts slice.inspect} # => [1, ... 5] ... [16, ... 20] '. Как вы заметили, вы получаете тот же результат, если '.index' опущен. –