我有一个名为frameActions
的表,在某些情况下不能包含某些属性:
action = 'UP'
frameActions = {}
frameActions['UP'] = { a = 1, b = 2 }
如何检查表格是否具有特定的属性名称?
if frameActions[action].c ~= nil then
-- do something
end
这种情况会引发错误:attempt to index a nil value
答案 0 :(得分:2)
您可以使用元方法检查您的代码是否尝试访问未定义的索引。在lua wiki上有详细记录。
使用以下代码,当操作定义到未定义的索引时,将调用函数 check_main_index(t,k)。访问未定义的属性时,将调用函数 check_sub_index(t,k)。
但是,如果将action定义为“UP”并且仅在将action定义为其他内容时抛出错误尝试索引nil值,则您编写的代码才能正常工作。 (用Lua 5.2测试)。
action = 'UP'
local function check_main_index(t,k)
print ( "main index : " .. k .. " does not exist" )
return nil
end
local function check_sub_index(t,k)
print ( "sub index : " .. k .. " does not exist" )
return nil
end
frameActions = setmetatable({}, {__index = check_main_index})
frameActions['UP'] = setmetatable({ a = 1, b = 2 }, {__index = check_sub_index})
if frameActions[action].c ~= nil then
print( "defined" )
else
print( "not defined" )
end
答案 1 :(得分:0)
您可以使用一些Lua魔法并将Etan Reisner's comment重写为
local E = {}
local my_val = ((frameActions or E).action or E).c
if my_val ~= nil then
--your code here
end
此代码检查frameAction是否为零。
说明:
这就是lua将如何评估第二行(考虑frameActions = {foo='bar'}
):
(frameActions or E) --> {}, because frameAction is not nil or false and then will be take as result
(frameAction.action or E) --> E, because there is no 'action' key in frameAction table, so second 'or' argument is taken
E.c --> nil, because there is no 'c' key in empty table
那些检查链'可能会更长。例如:
local E = {}
local my_val = ((((foo or E).bar or E).baz or E).xyz or E).abc
if my_val ~= nil then
--code if foo['bar']['baz']['xyz']['abc'] is not nil
end