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
所以这是我写的一些代码:
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