【问题标题】:Lua wont overwrite nil valueLua 不会覆盖 nil 值
【发布时间】:2021-03-19 06:27:14
【问题描述】:

我有一个 sql 语句可以返回结果,也可以不返回。如果它没有返回结果,我需要将 nil 值更改为“none”。我似乎无法弄清楚如何做到这一点。我把我的代码放在 pcall 中仍然不会被覆盖。我在 if 语句行中不断收到“尝试索引 nil 值”。我在 Debian 8 上运行 lua 5.2.3。我错过了什么?

--if ( SqlConnect(number).status == nil or SqlConnect(number).status == '') then
if pcall( SqlConnect(number).status ) then
    result = "none"
else
    result = SqlConnect(number).status
end

【问题讨论】:

  • 几个问题:SqlConnect(number) 返回什么类型?错误到底是在哪里抛出的? SqlConnect(number).status 是什么类型?我们需要更多信息才能正确回答。

标签: lua


【解决方案1】:

将 pcall() 与 assert() 结合起来,例如...

if pcall(assert,SqlConnect(number).status) then return true else return false end

...然后在正确或错误部分中执行您必须执行的操作。 假设您需要该值,然后在 true 部分执行 pcall() 以获取 false 部分中的值和后备情况。

【讨论】:

  • 我已经添加了如上所述的断言片段,但我仍在尝试索引一个 nil 值。我已经用一个有效的值对其进行了测试,它工作正常。
  • 我刚刚复制了您的 pcall(assert) 语句,实际上只是将其复制并粘贴到我的代码中,lua 脚本在“if pcall”行上失败。与“尝试索引一个零值堆栈回溯。”
【解决方案2】:

如果 pcall 返回成功,并且给出了正确的值,那么它只是使用它。否则,它将替换为您的“无”结果。

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() 可能希望 只是那个函数 作为 arg,而不是附加的 .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

【讨论】:

  • 我将您的代码复制并粘贴到我的脚本中,并且我在第一行得到“尝试索引零值”。本地成功............ SqlConnect(number).status 在有一个值时打印出一个值。如果没有价值,我只是想打印“none”。
  • 哦,是的,在== '' 上颠倒顺序,它会在看到空白之前看到 nil...
  • 它甚至没有进入 if 语句。它给了我本地成功线上的错误。刚刚在数据库上的一个值上对其进行了测试,它工作正常。
  • 并不完全惊讶。过去,我在 xpcall 上取得了更好的成功。措辞有点不同,但似乎运行时不会崩溃,比 pcall 更好。你让它运行了吗?
  • 还没有。仍在尝试获得正确的语法。 "结果 ret, err = xpcall(SqlConnect.status, debug.traceback);"不适合我。
猜你喜欢
  • 1970-01-01
  • 2014-09-27
  • 2016-06-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 2020-01-03
  • 2019-04-20
  • 2013-10-23
相关资源
最近更新 更多