#lua
#lua
Вопрос:
У меня есть оператор sql, который может возвращать результат или нет. Если он не возвращает результат, мне нужно изменить нулевое значение на «none». Кажется, я не могу понять, как это сделать. Я поместил свой код в pcall, который все равно не будет перезаписан. Я продолжаю получать «попытку индексировать нулевое значение» в строке оператора if. Я использую lua 5.2.3 в Debian 8. Чего мне не хватает?
--if ( SqlConnect(number).status == nil or SqlConnect(number).status == '') then
if pcall( SqlConnect(number).status ) then
result = "none"
else
result = SqlConnect(number).status
end
Комментарии:
1. Несколько вопросов: какой тип возвращает SQLConnect(number)? Где именно выдается ошибка? Какой тип SQLConnect(number).status ? Нам понадобится больше информации для правильного ответа.
Ответ №1:
Объедините pcall() с assert() подобным образом…
if pcall(assert,SqlConnect(number).status) then return true else return false end
…затем сделайте то, что вы должны сделать в разделе true или false.
Допустим, вам нужно значение, затем выполните команду pcall() в разделе true, чтобы получить значение и запасной вариант в разделе false.
Комментарии:
1. Я добавил фрагмент утверждения, как описано выше, и я все еще получаю попытку индексировать нулевое значение. Я протестировал его с допустимым значением, и оно работает нормально.
2. Я просто скопировал ваш оператор pcall (assert), буквально просто скопировал и вставил его в свой код, и сценарий lua завершается с ошибкой в строке «if pcall». с надписью «попытка индексировать трассировку стека с нулевым значением».
Ответ №2:
Если pcall возвращается как успешное, и было задано правильное значение, то он просто использует это. В противном случае он заменяет ваш результат ‘none’.
local success, result = pcall( SqlConnect(number).status )
if not success or result == '' or type( result ) == nil then
result = 'none'
end
Редактировать — то же самое, просто вычеркните это, измените его:
if not success or type( result ) == nil or result == '' then
Редактировать:
pcall(), вероятно, хочет только эту функцию в качестве аргумента, а не добавленную .status
.
Я не уверен, но если бы мне пришлось догадываться, именно поэтому он терпел неудачу.
https://riptutorial.com/lua/example/16000/using-pcall
Вот как бы вы написали это как xpcall:
function try()
attempt = SqlConnect( number ) .status or 'none' -- if nil, replace with 'none'
if attempt == '' then attempt = 'none' end -- replace blank strings with 'none'
return attempt
end
function except() -- if call to `SqlConnect( number )` completely fails
return 'none'
end
success, result = xpcall( try, except )
Комментарии:
1. Я скопировал и вставил ваш код в свой скрипт, и в первой строке я получаю «попытка индексировать нулевое значение». локальный успех…….. SQLConnect(number).status выводит значение, когда оно есть. Я просто пытаюсь напечатать «none», если нет значения.
2. о да, измените порядок на
== ''
обратном, он увидит ноль, прежде чем увидит пустое место…3. это даже не доходит до оператора if. Это выдает мне ошибку в локальной строке успеха. Просто протестировал его на значении, которое находится в базе данных, и оно работает нормально.
4. Не совсем удивлен. В прошлом у меня был больший успех с xpcall. Сформулировано немного по-другому, но, похоже, работает без сбоев, лучше, чем pcall. Вы все же запустили его?
5. пока нет. Все еще пытаюсь получить правильный синтаксис. «result ret, err = xpcall(SQLConnect.status, debug.traceback);» у меня не работает.