Собрав воедино пару разных комментариев и ваш код, это похоже на значение индекса массива в какой-то конкретной итерации цикла «в парах» (или, возможно, во всех них, но я коснусь этого в минута) - это строка вместо целого числа.
Подводя итог, если вы не хотите читать все целиком, циклы "для k, v попарно" будут перебирать весь массив, устанавливая k
в качестве индекса значения v
. Похоже, что ваш цикл «в парах» пытается перебрать значение nil, где k
- строка вместо целого числа. Вы можете также захотеть использовать ipairs
вместо pairs
в цикле for.
Значение someArray[1]
отличается от значения someArray["1"]
.
Индекс [1]
является совершенно другим индексом, чем индекс ["1"]
для любого данного массива.
Простым решением было бы использовать
ind = tonumber(k)
print(self.exce[ind])
Преобразует строку k
в числовой тип. Имейте в виду, что это может привести к ошибке, если k
не числовая строка. Если в массиве есть какие-либо значения, где индекс представляет собой нечисловую строку, вы можете получить ошибку. Как следует из другого ответа, преобразование индекса k
в строку вместо целого также будет работать и не приведет к ошибкам, если вы использовали нечисловое значение для своих индексов.
Мое предположение относительно того, почему это происходит, заключается в том, что функции, которую вы используете для хранения ваших данных в массиве, filterExceptions.server_onException( self, id )
, передается строка вместо целого числа, что приведет к значению k быть установленным в строку в этой итерации цикла for for.
Чтобы помочь лучше понять это, вот пример кода:
a = {true, false, false}
a[1] = true
a["1"] = true
print("Raw for in pairs loop")
for k, v in pairs (a) do
print(type(k)..k)
end
print("For in pairs converting k to a number")
for k, v in pairs (a) do
ind = tonumber(k)
print(type(ind)..ind)
end
print("For in ipairs")
--which I'm not sure I completely understand but
--it seems to skip over any iteration where k is not a number
for k, v in ipairs(a) do
print(type(k)..k)
end
Этот код выдает следующий вывод:
Raw for in pairs loop
number1
number2
number3
string1
For in pairs converting k to a number
number1
number2
number3
number1
For in ipairs
number1
number2
number3
РЕДАКТИРОВАТЬ: Не уверен, что происходит в таблице self.math
, поэтому я не могу комментировать это.
EDIT2: я бы также сослался на следующую ссылку: lua: перебрать все пары в таблице
Верхний ответ должен помочь понять разницу между парами и парами, если вы этого еще не сделали. Вы можете использовать ipairs для предотвращения повторения значений k
, где v == nil
с парами. пары будут перебирать каждую пару ключ / значение, тогда как ipairs будет перебирать целочисленные ключи, начиная с 1 и до тех пор, пока не достигнет нулевого значения.
EDIT3: Извините, это такой длинный ответ ... Я просто хотел быть тщательным.