UH2S3L7——访问Lua中table表现List和Dictionary

本章代码关键字

1
2
3
4
5
6
7
luaState.GetTable()            //获取全局table变量,为引用拷贝
LuaTable //Lua的table类型
luaTable[] //可以通过索引获取table的值,只支持int和string类型
luaTable.ToArray() //将LuaTable转换为数组形式
luaTable.ToDictTable<>() //将LuaTable转换为LuaDictTable<>形式
LuaDictTable<> //toLua的table模拟字典类,可以通过它去通过键获取值,键的类型不限
LuaDictEntry<> //LuaDictTable的键值对,可以通过迭代器遍历获取键与值

获取Table

和xLua的表映射为某种数据结构不同,toLua我们需要使用专门获取表的方法GetTable()

1
LuaTable luaTable = LuaManager.Instance.LuaState.GetTable("testList");

然后再通过获取到的表去表现其他的数据结构

值得一提的是,通过这种方式获取的Table是引用拷贝,修改其中的值会修改到Lua中table的值

1
2
3
4
5
6
7
8
9
LuaTable luaTable = LuaManager.Instance.LuaState.GetTable("testList");
luaTable[1] = 999;
LuaTable luaTableTmp = LuaManager.Instance.LuaState.GetTable("testList");
print("测试是否为引用拷贝:" + luaTable[1]);

LuaTable dic = LuaManager.Instance.LuaState.GetTable("testDic");
dic["1"] = 9999;
LuaTable dicTmp = LuaManager.Instance.LuaState.GetTable("testDic");
print("引用拷贝测试:" + dicTmp["1"]);

image

image

还可以通过下面的方式获取表,原理就是以获取全局变量的方式获取表,再as​成LuaTable

1
LuaTable table = LuaManager.Instance.LuaState["testClass"] as LuaTable;

table表现List

对于下面用table模拟的list

1
2
3
-- table表现的list
testList = {10, 20, 30, 40, 50, 60}
testList2 = {"123", "234", true, 1, 1.2}

如果我们要在C#中如列表那样调用其中的元素,我们需要先获取table,然后通过索引去获取其中的值,索引和Lua一样从1开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LuaTable luaTable = LuaManager.Instance.LuaState.GetTable("testList");
print(luaTable[1]);
print(luaTable[2]);
print(luaTable[3]);
print(luaTable[4]);
print(luaTable[5]);
print(luaTable[6]);

LuaTable luaTable2 = LuaManager.Instance.LuaState.GetTable("testList2");
print(luaTable2[1]);
print(luaTable2[2]);
print(luaTable2[3]);
print(luaTable2[4]);
print(luaTable2[5]);

imageimage

遍历table表现的List

如果要遍历table模拟的List,需要先通过ToArray()​方法,去转换成数组,再遍历

1
2
3
4
5
object[] objs = luaTable.ToArray();
for (int i = 0; i < objs.Length; i++)
{
print("遍历打印:" + objs[i]);
}

table表现Dictionary

对于下面用table模拟的Dictionary

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- table表现的Dictionary
testDic = {
["1"] = 1,
["2"] = 10,
["3"] = 20,
["4"] = 30,
}

testDic2 = {
["1"] = 1,
[true] = 1,
[false] = true,
["123"] = false,
}

如果我们要在C#中如字典那样调用其中的值,我们需要先获取table,然后通过键去获取对应的值

1
2
3
4
5
LuaTable dic = LuaManager.Instance.LuaState.GetTable("testDic");
print(dic["1"]);
print(dic["2"]);
print(dic["3"]);
print(dic["4"]);

image

但是,通过中括号传入键获取值,只支持int​和string​,其他类型的键没办法直接获取,
对于这种情况,我们需要先使用ToDictTable<>()​方法转换为LuaDictTable​,声明和使用方法与一般的Dictionary<>​一致
这样就能使用非int​和string​类型的键去获取值

1
2
3
4
5
6
7
8
9
10
11
12
LuaDictTable<string, int> luaDic = dic.ToDictTable<string, int>();
print("LuaDic: " + luaDic["1"]);
print("LuaDic: " + luaDic["2"]);
print("LuaDic: " + luaDic["3"]);
print("LuaDic: " + luaDic["4"]);

LuaTable dic2 = LuaManager.Instance.LuaState.GetTable("testDic2");
LuaDictTable<object, object> luaDic2 = dic2.ToDictTable<object, object>();
print(luaDic2["1"]);
print(luaDic2[true]);
print(luaDic2[false]);
print(luaDic2["123"]);

image

image

遍历table表现的dictionary

对于LuaDictTable​,最好使用迭代器去遍历

1
2
3
4
5
IEnumerator<LuaDictEntry<object, object>> ie = luaDic2.GetEnumerator();
while (ie.MoveNext())
{
print(ie.Current.Key + "_" + ie.Current.Value);
}