使用自定义lua解析管理器调用lua脚本中的table

lua,table · 浏览次数 : 0

小编点评

**Custom Lua Analysis Manager:** The custom Lua analysis manager is used to parse a table and call Lua functions on it. It provides methods for getting and setting table values, as well as accessing and manipulating the table's structure. **Accessing Table Values:** - `tableCallLuaEntrance.Instance().LuaState.GetTable("arrayTable")` gets a table named "arrayTable". - `tableCallLuaEntrance.Instance().LuaState.GetTable("arrayTable2")` gets a table named "arrayTable2". **Converting Table to Different Types:** - `tableCallLuaEntrance.Instance().LuaState.ToArray()` converts an array to an object array. - `tableCallLuaEntrance.Instance().LuaState.ToDictTable()` converts a dictionary-like table to a Lua dictionary. **Accessing and Iterating Over Table Data:** - `tableCallLuaEntrance.Instance().LuaState.GetTable("dicTable1")[key]` retrieves a value from a dictionary-like table. - `tableCallLuaEntrance.Instance().LuaState.GetTable("dicTable2")[key]` retrieves a value from a dictionary-like table. **Accessing and Iterating Over Table Entries:** - `tableCallLuaEntrance.Instance().LuaState.GetTable("arrayTable").ToArray()` converts an array to a object array. - `for (int i = 0; i < array.Length; i++)` iterates over the object array. **Testing Script Content:** The provided script demonstrates how to access and manipulate table data using the custom Lua analysis manager. It converts between different table types, retrieves data from a dictionary-like table, and iterates over the table's entries. **Additional Notes:** - The `tableCallLuaEntrance` object is an instance of the `CallLuaManager.Instance()` class. - The `LuaState` object represents a Lua environment where the code is executed. - The `ToDictTable` method is used to convert a dictionary-like table to a Lua dictionary. - The `ToArray` method is used to convert an array to an object array.

正文

[5] 使用自定义lua解析管理器调用table

访问数组类型的table

CallLuaEntrance测试脚本中内容:

 //--------------------------------------访问table-----------------------------
//4.1 访问list/数组类型的table
//获取table
LuaTable luaTable = CallLuaManager.Instance().LuaState.GetTable("arrayTable");
//直接访问
Debug.Log("luaTable[1] " + luaTable[1]);
Debug.Log("luaTable[2] " + luaTable[2]);
Debug.Log("luaTable[3] " + luaTable[3]);
Debug.Log("luaTable[4] " + luaTable[4]);
Debug.Log("luaTable[5] " + luaTable[5]);
Debug.Log("luaTable[6] " + luaTable[6]);
Debug.Log("luaTable[7] " + luaTable[7]);

//转成array存储访问
Object[] array = luaTable.ToArray();
for (int i = 0; i < array.Length; i++)
{
    Debug.Log("listTable遍历访问 " + array[i]);
}

//检测是否是深拷贝
//更改最后一个数值
luaTable[7] = 9999;
Debug.Log("-------------->luaTable[7] " + luaTable[7]);
//获取arrayTable2 
luaTable = CallLuaManager.Instance().LuaState.GetTable("arrayTable2");

Object[] array2 = luaTable.ToArray();
for (int i = 0; i < array2.Length; i++)
{
    Debug.Log("listTable遍历访问" + array2[i]);
}

对应的lua内容:

--list/数组类型的table
arrayTable = {2024,05,10,19,55,66,78}

arrayTable2 = {"Hello","Lua",ture,123,88.88}

访问DIctionary类型的table

在C#脚本中使用LuaTable来接受获取到的Table,对于字典类型的Table调用LuaTable的ToDictTable方法转成对应类型的LuaDictTable

类型,获取字典的迭代器对字典进行迭代遍历。

CallLuaEntrance测试脚本中内容:

 //4.2 字典类型的table数值获取
 luaTable = CallLuaManager.Instance().LuaState.GetTable("dicTable1");
 Debug.Log("luaTable[\"date\"] " + luaTable["date"]);
 Debug.Log("luaTable[\"name\"] " + luaTable["name"]);
 Debug.Log("luaTable[\"blog\"] " + luaTable["blog"]);
 Debug.Log("luaTable[\"WebBlog\"] " + luaTable["WebBlog"]);


luaTable = CallLuaManager.Instance().LuaState.GetTable("dicTable2");
//转成LuaDictTable
// 因为键值对 各自的类型不统一 因此使用object 
// 如果类型统一可以使用已知的
LuaDictTable<object, object> luaDictionary = luaTable.ToDictTable<Object, Object>();
Debug.Log("dictionary[true] = " + luaDictionary[true]);

//通过迭代器遍历
IEnumerator<LuaDictEntry<object, object>> enumerable = luaDictionary.GetEnumerator();

while (enumerable.MoveNext())
{
Debug.Log(enumerable.Current.Key + "  ,  " + enumerable.Current.Value);
}

访问的lua脚本中数据:

--Dictionary类型的table
dicTable1 = {
	["date"] = "2024/05/10",
	["name"] = "TonyChang",
	["blog"] = "TonyCode",
	["WebBlog"] = "cnblogs",
}

dicTable2 = {
	[12] = 666,
	[true] = 1,
    [20.01] = "Yes!",
	["tony"] = "geeks",
}

最后总结一下:

在C#中调用lua中的Table和函数,就是先使用LuaState中方法获取到对应的函数或者table,之后根据获取的类型进行对应的解析访问。

一般我们调用一个具体的函数或者table时候,已经清楚其对应的类型,可以根据对应类型将table具体转换,之后访问使用。

此外发现,luaTable中的是浅拷贝(索引指向同一个数值),即在获取到的luaTable中更改数值其原数值也会改变。

与使用自定义lua解析管理器调用lua脚本中的table相似的内容:

使用自定义lua解析管理器调用lua脚本中的table

[5] 使用自定义lua解析管理器调用table 访问数组类型的table CallLuaEntrance测试脚本中内容: // 访问table //4.1 访问list/数组类型的table //获取table LuaTable luaTable = CallLuaManager.Instance

[4]自定义Lua解析器管理器-------演化脚本V0.7

使用自定义委托通过tolua来调用多返回值和长参数类型的函数。 防踩坑指南,使用自定义委托需要将委托类型添加到CustomSettings中。

自定义Lua解析器管理器-------演化脚本V0.5

[3]自定义Lua解析器管理器 演化脚本V0.5 方便我们在项目中使用Lua解析方法,我们封装管理一个lua解析器,管理LuaState的方法执行。 解析器脚本: using LuaInterface; namespace BaseFramework { /// /// 自定义的

toLua中Lua调用C#中的类

toLua中Lua调用C#: [7]Lua脚本调用C#中的class 准备工作:打算在Lua脚本中使用Debug,使用lua调用C#脚本,需要绑定LuaState和自定义添加Debug Generated by EmmyLua(https://github.com/EmmyLua) Created

[转帖]Redis里使用Lua

http://me.52fhy.com/lua-book/chapter11.html 版本:自2.6.0起可用。 时间复杂度:取决于执行的脚本。 使用Lua脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。 原子操作。redis会将整个脚本作为一个整体执行,中间不会被

在langchain中使用自定义example selector

# 简介 在之前的文章中,我们提到了可以在跟大模型交互的时候,给大模型提供一些具体的例子内容,方便大模型从这些内容中获取想要的答案。这种方便的机制在langchain中叫做FewShotPromptTemplate。 如果例子内容少的话,其实无所谓,我们可以把所有的例子都发送给大语言模型进行处理。

Django 自定义管理命令:从入门到高级

title: Django 自定义管理命令:从入门到高级 date: 2024/5/16 18:34:29 updated: 2024/5/16 18:34:29 categories: 后端开发 tags: Django 自定义命令 入门教程 高级技巧 命令创建 命令使用 自定义管理 第 1 章

[转帖]Docker镜像最佳实践

https://www.zhihu.com/people/trumandu-95/posts 5条最佳建议 1.仅安装产线需要依赖与软件 镜像尽可能最小原则 仅复制jar/war 使用自定义JRE(Java Runtime Environment) 2.使用多阶段构建 FROM maven:3.6.

5.使用日志+自定义全局异常过滤器

刚开始写文章,封装Base基类的时候,添加了trycatch异常块,不过当时没有去记录日志,直接return了。有小伙伴劝我不要吃了Exception 其实没有啦,项目刚开始,我觉得先做好整体结构比较好。像是盖楼一样。先把楼体建造出来,然后再一步一步的美化完善。 基础的仓储模式已经ok,Autofa

博客构建性能优化笔记 | 提速 3 倍

笔者的博客基于 VitePress 搭建的,使用其自定义主题能力完成博客主题 @sugarat/theme 的搭建。 前段时间有群友反馈说使用主题构建后耗时增加非常明显。 前后耗时大概增加了 10 倍,过于离谱了。 断断续续的投入差不多 1 个月的时间完成了优化,效果还是很明显。 至此写篇文章记录&