[lua]: ключ со значением 1 не делает то же самое, что и обычный 1 - PullRequest
0 голосов
/ 24 июня 2018

Я кодировал для мода, который я создаю для игры, но я столкнулся с проблемой с таблицами, не возвращающими значения при вводе ключа:

for k, v in pairs(self.math) do
    print(self.exce[1])
    print(self.exce[k])
    print(k)
    if self.exce[k] ~= nil then
        self.math[k] = nil
    end
end

Это особая часть скрипта, котораяломка.Когда я запускаю их в игре, он возвращает:

[lua]: true
[lua]: nil
[lua]: 1

Это означает, что в основном говорится, что 1 не равно 1. Функция, которую я использовал для хранения своих данных,

function filterExceptions.server_onException( self, id )
    if self.exce[id] == nil then
        self.exce[id] = true
        self.network:sendToClients( "client_onList", id )
    else
        self.exce[id] = true
        self.network:sendToClients( "client_offList", id )
    end
end

В этом коде self представляет собой таблицу, созданную игрой, к которой вы можете получить доступ и получить данные игры или сохранить их, а идентификатор происходит от функции, которую я создал для получения идентификатора игрока.Этот идентификатор в данном случае равен 1 (я печатал его несколько раз). Я знаю, что каждая часть этого кода работает, за исключением кода в первом блоке, и особенно той части, где он пытается выполнить self.exce[k].Я много пробовал, как проходить через каждую переменную в self.exce, чтобы посмотреть, была ли она там, а потом делать что-то, но это все равно не сработало.Очень досадно, что lua думает, что k ~ = 1, пока он определенно есть, я даже использовал подобный код в работающей части.

Так что же плохого в этом коде в том, что он не печатает self.exce[k], покаself.exce[1] работает?Не беспокойтесь о создании таблицы и прочего, потому что это уже происходит всякий раз, когда это необходимо, иначе это также дало бы ошибки об этом.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Собрав воедино пару разных комментариев и ваш код, это похоже на значение индекса массива в какой-то конкретной итерации цикла «в парах» (или, возможно, во всех них, но я коснусь этого в минута) - это строка вместо целого числа.

Подводя итог, если вы не хотите читать все целиком, циклы "для 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: Извините, это такой длинный ответ ... Я просто хотел быть тщательным.

0 голосов
/ 24 июня 2018

Оказывается, преобразование идентификатора в строку исправляет это, хотя я все еще не понимаю, почему этот код работает с другим блоком, а не с этим.

function filterExceptions.server_onException( self, id )
local id2 = tostring(id)
if self.exce[id2] == nil then
    self.exce[id2] = true
    self.network:sendToClients( "client_onList", id )
else
    self.exce[id2] = true
    self.network:sendToClients( "client_offList", id )
end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...