Lua не будет перезаписывать нулевое значение

#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 )
 

https://www.tutorialspoint.com/lua/lua_error_handling.htm

Комментарии:

1. Я скопировал и вставил ваш код в свой скрипт, и в первой строке я получаю «попытка индексировать нулевое значение». локальный успех…….. SQLConnect(number).status выводит значение, когда оно есть. Я просто пытаюсь напечатать «none», если нет значения.

2. о да, измените порядок на == '' обратном, он увидит ноль, прежде чем увидит пустое место…

3. это даже не доходит до оператора if. Это выдает мне ошибку в локальной строке успеха. Просто протестировал его на значении, которое находится в базе данных, и оно работает нормально.

4. Не совсем удивлен. В прошлом у меня был больший успех с xpcall. Сформулировано немного по-другому, но, похоже, работает без сбоев, лучше, чем pcall. Вы все же запустили его?

5. пока нет. Все еще пытаюсь получить правильный синтаксис. «result ret, err = xpcall(SQLConnect.status, debug.traceback);» у меня не работает.