【问题标题】:LUA table with function arguments and passing nil带有函数参数并传递 nil 的 LUA 表
【发布时间】:2021-05-01 21:51:33
【问题描述】:

尝试使用表作为从外部传入的用户生成数据的查找。

tab = { ['on']  = function(x) x=x+1 return x end,
        ['off'] = function(x) x=x+2 return x end,
        ['high']= function(x) x=x+3 return x end,
        ['low'] = function(x) x=x+4 return x end
        }
do
   local var=0
   local userData='on'
   
   var = tab[userData](var)
   print(var)
   if var>0 then
      --do something here 
   else
   end

end

如果该值存在于表中(userData='on'),则程序按预期工作并打印

$lua main.lua
1

如果表中不存在该值(userData='fluff')程序失败

$lua main.lua
lua: main.lua:11: attempt to call a nil value (field '?')
stack traceback:
main.lua:11: in main chunk
[C]: in ?

如果键不存在,我该如何使用这样的表?

【问题讨论】:

  • 在尝试使用结果进行函数调用之前检查以确保 tab[userData] 返回非 nil。
  • 你是对的。谢谢。

标签: lua


【解决方案1】:

最好的解决方案是首先不要让用户输入无效值。

如果你不能确定userDatatab 中的一个键,你应该在使用它来索引tab 之前检查它

if not tab[userData] then
  print("invalid userdata")
  return
end

如果您需要 tab[userData] 默认为某个函数,您可以这样做

tab[userData] = tab[userData] or function () print("I'm your default function!") end

或使用另一个答案中所示的元表。

【讨论】:

    【解决方案2】:

    您可以对不存在的键使用元表。 例如:

    local tab = {}
    setmetatable(tab, {__index = function()
        return function(x)
            return x + 1
        end
    end})
    print(tab['on'](1))
    

    打印结果为:2

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 2018-10-11
      • 2013-07-13
      • 2018-12-16
      • 2013-06-04
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      相关资源
      最近更新 更多