Lua Metatables尝试索引?

时间:2015-03-09 13:22:37

标签: lua metatable

所以这里是我写的一些代码:

local fileFunc = {createFolder, openObj, deleteObj, createTxt, theMenu}
setmetatable(fileFunc, mt)

function fileSys()
  local fileAction, code
  print("The File System")
  print("You are currently at "..current_window)
  while true do
    print("1 Create a new Folder\n2 Open an object\n3 Delete an Object\n4 Create a new text file\n5 Other options")
    fileAction = userInInt()
    code = fileFunc[fileAction]()
    if code > 3 then invRet("fileSys()", code) end
    if code == 1 then return 0
    else return code end
  end
end

我认为通过使用__index元方法,没有错误,但它仍然会引发attempt to call field ?错误。我猜测它仍然会引发错误,所以有没有办法可以使用pcall()

来捕获它

mt看起来像这样:

local mt = { __index = invalid }

无效:

function invalid()
  print("Invalid operand, please try again.")
end

仅当用户输入表中未列出的操作数(input > #fileFunc)时才会抛出此错误

1 个答案:

答案 0 :(得分:3)

invalid不会返回任何内容,但它也不会停止该程序。如果您尝试从不返回任何内容的函数中获取结果,则会得到nil

这样做fileFunc[fileAction]将打印"Invalid operand, please try again.",但程序将继续运行,索引的结果将为nil

不是使用__index设置metatable并抛出并捕获错误,只需检查nil就更简单了:

if not fileFunc[fileAction] then
    print("Invalid operand, please try again.")
else
    local result = fileFunc[fileAction]()
    -- Do something
end