Lua 元表尝试建立索引?

Lua Metatables Attempt to Index?

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

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

仅当用户输入未在 table (input > #fileFunc)

中列出的操作数时才会引发此错误

invalid 不会 return 任何东西,但它也不会停止程序。如果您尝试从一个没有 return 任何内容的函数中获取结果,您将得到 nil

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

与其设置带有 __index 的元表并抛出并捕获错误,不如检查 nil:

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