如何检查表元素是否为零

时间:2014-12-17 21:47:29

标签: lua conditional-statements null lua-table

我有一个名为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

2 个答案:

答案 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