Ошибка при присвоении массива строке многомерного массива

Я пишу на Haxe и ориентируюсь на Neko. Сегодня столкнулся с такой проблемой:

var a:Array<Array<Int>> = new Array<Array<Int>>();
a[1] = [1, 2, 3];

Вторая строка выдает исключение «Недопустимый доступ к массиву». Также невозможно выполнить итерацию по строке следующим образом:

for (i in a[0]) ...

Такой код всегда работал нормально, но не сегодня. В чем здесь может быть проблема? Ячейки и строки, к которым я пытаюсь получить доступ, гарантированно существуют (если говорить об индексах).


person Gulvan    schedule 29.04.2018    source источник


Ответы (1)


Эта проблема не специфична для Neko: = new Array<Array<Int>>() инициализирует только внешний массив — это эквивалентно написанию = []. Так как это пустой массив, любое обращение будет за его пределы и вернет null.

В вашем конкретном примере = [[], []] устранит ошибку (инициализирует массив с двумя внутренними массивами). Если вы заранее знаете количество необходимых внутренних массивов, понимание массивов является удобным способ сделать инициализацию:

var a:Array<Array<Int>> = [for (i in 0...numInnerArrays) []];
person Gama11    schedule 29.04.2018
comment
Отличный ответ. Трюк for в объявлении массива был мне неизвестен! Также рассмотрите array.insert() как альтернативу присвоению значений позициям массива, чтобы помочь визуализировать код, когда позиционирование не так важно. Интересно, является ли объявление всего содержимого массива хорошей практикой? В основном в 2d-массивах, подобных этому? - person oli_chose123; 30.04.2018
comment
Это довольно широкий вопрос. В чем заключается хорошая практика? Стиль кода? Спектакль? и т.д... Конечно, для очень больших массивов это может стать проблемой, но для простых случаев я не вижу в этом никаких проблем. - person Gama11; 01.05.2018