lua - 位置给定为字符串的 Lua 表访问
问题描述
我有一张桌子,我正在尝试访问作为字符串传入的特定位置。使用字符串访问正确位置的最简单方法是什么?
例如,如果表格如下所示:
a.b1 = true
a.b2.c1 = true
a.b2.c2 = false
a.b3 = true
给定位置“a.b2.c2”作为字符串,如何将 a.b2.c2 更改为 true。
解决方案
如果您只有一个级别,则可以使用方括号索引:
function setSingle(obj, key, value)
obj[key] = value
end
setSingle(a, "b1", "foo")
print(a.b1) --> foo
如果有多个,则需要对该索引进行多次迭代。您可以使用循环来执行此操作:
function setMultiple(obj, keys, value)
for i = 1, #keys - 1 do
obj = obj[keys[i]]
end
-- Merely "obj = value" would affect only this local variable
-- (as above in the loop), rather than modify the table.
-- So the last index has to be done separately from the loop:
obj[keys[#keys]] = value
end
setMultiple(a, {"b2", "c1"}, "foo")
print(a.b2.c1) --> foo
您可以使用它string.gmatch
来解析格式正确的键列表。[^.]+
将匹配由非句点符号组成的“单词”:
function parseDots(str)
local keys = {}
for key in str:gmatch "[^.]+" do
table.insert(keys, key)
end
return keys
end
把这一切放在一起,
setMultiple(a, parseDots("b2.c2"), "foo")
print(a.b2.c2) --> foo
您可能遇到的一个问题是您无法使用此功能创建新表;您必须先创建包含表,然后才能在其中创建任何键。例如,在添加之前,"b4.c3"
您必须添加"b4"
.
推荐阅读
- angular - ngFor 在具有不同属性的列中
- android - 我想在我的应用程序中添加一个共享按钮,但我不明白如何实现它,我在我的应用程序中显示来自 firebase 存储的图像
- javascript - 为什么after方法在jQuery中不起作用?
- spring-boot - 如何使用 Mockito 模拟实例化类的方法?
- apache-poi - docx4j 或 Apache-POI:如何从包含图像和英语以外的语言的 docx 文件中获取段落 ID?
- inno-setup - 如何使用 Inno Setup 为 Windows 命令行创建别名?
- java - Spring REST api OAuth2 验证来自外部授权服务器的令牌
- c# - 简单的异常处理
- c# - C# Reflection - GetCustomAttributes for Type 从父类获取属性
- ejs - 用 ejs 中的现有数据填充表单