Давайте внимательнее посмотрим на код:
field=[[1,0],[0,0]]
coordindates = []
field.each_with_index do |item|
if item.index(1)
coordinates.push(field.index(item)).push(item.index(1))
end
end
Пусть:
enum = field.each_with_index
#=> #<Enumerator: [[1, 0], [0, 0]]:each_with_index>
Как вы видите, это возвращает перечислитель.
Руби видит свой код так:
enum.each do |item|
if item.index(1)
coordinates.push(field.index(item)).push(item.index(1))
end
end
Элементы счетчику будут переданы в блок по Enumerator#each, который будет вызывать Array#each с приемником, field
является экземпляром класса Array
.
Мы можем увидеть элементы enum
путем преобразования его в массив:
enum.to_a
#=> [[[1, 0], 0], [[0, 0], 1]]
Как вы видите, она состоит из двух элементов, каждый из которых массив из двух элементов, первый из которых является массивом из двух целых чисел а второе - целое число.
Мы можем имитировать работу each
, посылая Enumerator#next к enum
и назначая блок переменных к значению, возвращаемых next
. Так как только один блок переменной, item
, мы имеем:
item = enum.next
#=> [[1, 0], 0]
То есть вполне вероятно, ни то, что вы ожидали, ни то, что вы хотели.
Далее вы вызываете Array#index на item
:
item.index(1)
#=> nil
index
поиск массива item
для элемента, который равен 1
. Если он находит один, он возвращает индекс этого элемента в массиве. (Например, item.index(0) #=> 1
). Поскольку ни [1,0]
, ни 0
не равно 1
, index
nil
.
Давайте перемотаем (и воссоздаем перечислитель). Вам нужно два блока переменных:
field.each_with_index do |item, index|...
, который так же, как:
enum.each do |item, index|...
Итак:
item, index = enum.next
#=> [[1, 0], 0]
item #=> [1, 0]
index #=> 0
и
item.index(1)
#=> 0
Я дам вам взять отсюда, но позвольте мне упомянуть еще одну нг. Я не защищаю его, но вы могли бы написать:
field.each_with_index do |(first, second), index|...
в этом случае:
(first, second), index = enum.next
#=> [[1, 0], 0]
first #=> 1
second #=> 0
index #=> 0
++ Возможно, ваш следующий ответ может включать в себя некоторые примеры flossing **^,,,^** – naomik