在lua中,如果我们尝试索引一系列嵌套表(其中任何一个都可以为nil),我们可能会编写如下代码:
-- try to get a.b.c
local ret
if a then
local b = a.b
if b then
ret = b.c
end
end
我认为这既冗长又丑陋。还有更简单的方法:
-- method 1
local ret = a and a.b and a.b.c
-- method 2
local ret = ((a or {}).b or {}).c
我知道我很吹毛求疵,但这两种方法仍然不完美,方法1导致更多的索引操作(做了两次a.b),方法2创建了一些不必要的表。
所以我想知道是否有一种没有像“?”这样的副作用的方法。在 C# 中?或者 '?。'运算符违反了lua的设计理念吗?
只要写一个函数:
local function nestedIndexOrNil(t, ...)
for _, k in ipairs{...} do
if not t then
return nil
end
t = t[k]
end
return t
end
nestedIndexOrNil(a, 'b', 'c')