1

Тема: пишет bad argument #1 to 'insert' (table expected, got nil)

Вопрос на засыпку, как подружится с nil в массиве?
В одном операторе, с разных мест прилетает x и y, только одно значение может быть равно nil, пустое, но его надо учитывать.

table.insert(arr, 1, {[x] = y})

Когда y = 0 пишет bad argument #1 to 'insert' (table expected, got nil
Можно победить какнибудь?

2

Re: пишет bad argument #1 to 'insert' (table expected, got nil)

kaliuga пишет:

Вопрос на засыпку, как подружится с nil в массиве?
В одном операторе, с разных мест прилетает x и y, только одно значение может быть равно nil, пустое, но его надо учитывать.

table.insert(arr, 1, {[x] = y})

Значение элемента таблицы не может быть nil
Как вариант можно перевести nil в строку

if(y==nil)then y="nil" end

kaliuga пишет:

Когда y = 0 пишет bad argument #1 to 'insert' (table expected, got nil
Можно победить какнибудь?

Тут непонятно, y=0 вполне приемлимо

3

Re: пишет bad argument #1 to 'insert' (table expected, got nil)

kaliuga пишет:

table.insert(arr, 1, {[x] = y})

Когда y = 0 пишет bad argument #1 to 'insert' (table expected, got nil

Эта ошибка совсем не про nil в x или y
Такая ошибка возникает в случае, когда arr не есть таблица. А до вызова указанной строки надо переменной arr присвоить таблицу (например, пустую).

Вот такой код уже не будет давать указанную ошибку (обратите внимание на первую строку arr = {}б в ней суть):

arr = {}

x = 2
y = 1

table.insert(arr, 1, {[x] = y})

Добавлю, что добавление в таблицу здесь можно сделать более простым синтаксисом, нежели table.insert, а именно:

arr = {}

x = 2
y = 1

arr[x] = y

kaliuga пишет:

В одном операторе, с разных мест прилетает x и y, только одно значение может быть равно nil, пустое, но его надо учитывать.

Если y (т.е. значение) равно nil - то это не проблема. Все работает корректно.

А вот если x равно nil - то тут да, проблема есть, т.к. индекс в таблице не может быть равен nil.
Я бы с таком случае предложил перед добавлением в таблицу таких значений (когда x равно nil) заменять его на какое-то "нереальное" значение, исходя из бизнес-логики. Ну например, если x может быть только положительным по идее в данной части кода - то можно добавить проверку перед вставкой в таблицу:

if x == nil then
  x = -1
end

Там, где потом из таблицы значения читаем (или проверяем наличие) - тоже не забыть такую подмену вставить.

4

Re: пишет bad argument #1 to 'insert' (table expected, got nil)

swerg пишет:

Если y (т.е. значение) равно nil - то это не проблема. Все работает корректно.

Небольшое замечание.
Значению таблицы присвоить nil, конечно, можно, но это ж все равно что удалить элемент.
Другими словами, если мы присвоим значению таблицы nil, то потом никак не определим что присваивали что либо.

arr={}
arr[1]=3
arr[2]=nil
arr[3]="nil"
for key,value in pairs(arr) do
  message("key="..tostring(key).." value="..tostring(value))
end

5

Re: пишет bad argument #1 to 'insert' (table expected, got nil)

BlaZed пишет:

Значению таблицы присвоить nil, конечно, можно, но это ж все равно что удалить элемент.
Другими словами, если мы присвоим значению таблицы nil, то потом никак не определим что присваивали что либо.

Да, вы правы, есть такой момент в самом деле. Не обращал на него внимание.