LUA 语言中subtree 的使用教程

devtools/2024/9/22 14:02:15/

在线编辑器: https://www.runoob.com/try/runcode.php?filename=HelloWorld&type=lua

在Lua语言中,"subtree"通常指的是一个子表或者子树,它指的是一个Lua表(table)中的一个部分,可以是一个单独的键值对,也可以是一个嵌套的表结构。Lua的table是动态的,可以包含任意类型的数据,包括其他表。以下是一些关于如何在Lua中使用subtree的基本教程:

1.创建和访问子表:

创建一个父表

local parent_table = {key1 = "value1",key2 = {nested_key = "nested_value",another_key = 123}
}

访问子表

local nested_table = parent_table.key2
print(nested_table.nested_key) -- 输出 "nested_value"

2. 修改子表:

nested_table.nested_key = "new_nested_value"
print(nested_table.nested_key) -- 输出 "new_nested_value"

3. 添加子表元素:

parent_table["new_key"] = { new_subkey = "new_subvalue" }
print(parent_table.new_key) -- 输出 { new_subkey = "new_subvalue" }

4. 删除子表元素:

parent_table.key2 = nil -- 删除整个子表
-- 或者
parent_table.key2.nested_key = nil -- 删除单个键值对

5. 使用循环遍历子表:

for key, value in pairs(parent_table.key2) doprint(key, value)
end

6. 使用表的复制和嵌套:

local copy = parent_table.key2 -- 创建子表的浅复制
local deep_copy = setmetatable({}, getmetatable(parent_table.key2)) -- 创建子表的深复制

注意:Lua的复制仅复制引用,深复制需要额外处理

-- 创建一个父表
local parent_table = {key1 = "value1",key2 = {nested_key = "11111",another_key = 22222}
}-- 打印父表
print(parent_table)  -- 输出父表的内容,格式可能是类似 "table: 0x1da5650"
print(parent_table.key1)-- 访问子表
local nested_table = parent_table.key2
print(nested_table.nested_key) -- 输出 "11111"
print(nested_table.another_key) -- 输出 22222-- 修改新的子表元素
nested_table.nested_key = "new_nested_value"
print(nested_table.nested_key) -- 输出 "new_nested_value"-- 添加新的子表元素
parent_table.key2.child1 = "Child 21"
print(parent_table.key2.child1)  -- 输出 "Child 21"
### key2 = {
###   nested_key = "11111",
###   another_key = 22222,
###   child1 = "Child 21"
### }--父表增加新键--添加新的子表元素
parent_table["new_key"] = { new_subkey = "new_subvalue" }
print(parent_table.new_key.new_subkey)-- 输出 { new_subkey = "new_subvalue" }
#添加了一个新的键值对 new_key,其值是一个新的子表,其中只有一个键 new_subkey 和对应的值 "new_subvalue"-- 定义一个递归函数来打印表的内容
function printTable(t, indent)indent = indent or 0for key, value in pairs(t) do-- 打印键io.write(string.rep(" ", indent))if type(key) == "table" thenio.write("{\\n")elseio.write(key .. " = ")end-- 打印值if type(value) == "table" thenprintTable(value, indent + 2)elseio.write(tostring(value) .. "\\n")endendif indent == 0 thenio.write("}\\n")end
end-- 使用printTable函数来打印父表
printTable(parent_table)

代码中,parent_table 是一个 Lua 表,其中包含两个键值对:key1 和 key2。key2 是另一个表,它有自己的子键 nested_key 和 another_key
parent_table.new_key 是一个表

subtree:add

在Lua语言中,subtree:add通常用于表示在树状数据结构(如字典或表)中添加一个子节点或元素。这里假设subtree是一个表或字典,而add是一个函数或者方法,用于在特定键下插入新的值。以下是一个简单的例子:

-- 假设有一个表示树的结构,其中每个节点是一个表,包含键值对
local subtree = {name = "root",children = {} -- 存储子节点的表
}-- 定义一个add函数,用于在children表中添加子节点
function subtree:add(childKey, childValue)if not subtree.children[childKey] thensubtree.children[childKey] = {}endsubtree.children[childKey].name = childValue -- 或者根据需要添加其他属性
end-- 使用add函数添加一个子节点
subtree:add("child1", "Child 21")
print(subtree.name) 
print(subtree.children.child1.name) -- 现在subtree应该是这样的:
-- {
--     name = "root",
--     children = {
--         {
--             name = "Child 1"
--         }
--     }
-- }

在这里插入图片描述

代码

1、local msg_type = buffer(offset, 1):这行代码从缓冲区中读取一个字节的数据,并将其存储在msg_type变量中。这里的offset是一个变量,表示从缓冲区的哪个位置开始读取,而1表示读取的字节数。

2、local msg_type_mt = msgtype[msg_type:bitfield(3,5)]:这行代码使用了msg_type的bitfield方法来提取消息类型中的特定位段。bitfield方法的参数3, 5表示提取从第3位到第5位的位段(在Lua中,位操作通常是从1开始计数的)。提取出来的位段值将用作msgtype表的索引,以查找对应的类型信息并存储在msg_type_mt变量中。

-- 假设的msgtype表,用于存储消息类型信息
local msgtype = {[0] = {name = "Type0", description = "描述信息0"},[1] = {name = "Type1", description = "描述信息1"},[2] = {name = "Type2", description = "描述信息2"},-- 更多消息类型
}-- 假设的buffer函数和offset变量
local buffer = function(offset, length)-- 这里应该是读取缓冲区的代码,返回对应的数据-- 为了示例,我们假设返回的是数字3return 3
endlocal offset = 0 -- 假设的偏移量-- 读取消息类型并提取消息类型信息
local msg_type = buffer(offset, 1)
local msg_type_mt = msgtype[msg_type:bitfield(3, 5)]-- 输出结果
print(msg_type_mt.name, msg_type_mt.description)

示例中. 假设buffer函数返回的是数字3,然后msg_type:bitfield(3, 5)将提取出3的二进制表示中的第3到第5位,即011(二进制),转换为十进制就是3。因此,msg_type_mt将会是msgtype[3],即{name = “Type2”, description = “描述信息2”}。


http://www.ppmy.cn/devtools/57205.html

相关文章

人工智能 (AI) 基本概念 入门篇【C#】版

1. 什么是人工智能? 人工智能(Artificial Intelligence, AI)是指计算机系统能够执行通常需要人类智能的任务,如视觉识别、语音识别、决策和语言翻译等。AI的核心是通过算法和数据进行学习和推理,以实现智能行为。 2.…

第5章:软件工程

第5章:软件工程 软件工程概述 软件生命周期 软件过程 1.能力成熟度模型(CMM) CMM(能力成熟度模型)是一个评估和确定组织软件过程成熟度的模型。它最早于1987年由美国国防部软件工程研究所(SEI)提出,其目的…

【计算机毕业设计】061互助学习微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

layui-表格

1.使用方法 加上table标签 加上classlayui-table colgroup是列属性 tr是行td是列 thead是表头,后面一一对应 2.基础属性 加lay-even逐行换色 加lay-skin 设置边框风格

Android平台崩溃和 ANR 问题进行符号化解析、解析崩溃日志的内存地址

使用Android Logcat Stacktrace Utility | Android Logcat | 1.2.3 1.设置so库路径 2.打开Stacktrace Utility工具 3.在Original粘贴报错内存地址 4.点击Resolve Stacktraces,就会解析出内存地址 如果是红色,解析失败了,缺少原生so库,可以在第一步添加so库文件再次尝试…

Mx Admin 基于react18的后台管理系统

前言 Mx Admin 基于React18 vite5 antd5的后台管理系统, 基于RBAC的权限控制系统,动态菜单和动态路由支持tab路由缓存嵌套菜单支持多种菜单布局模式亮暗色主题切换

EtherCAT通讯介绍

一、EtherCAT简介 EtherCAT(Ethernet for Control Automation Technology)是一种实时以太网技术,是由德国公司Beckhoff Automation在2003年首次推出的。它是一种开放的工业以太网标准,被设计用于满足工业自动化应用中的高性能和低…

强化学习的数学原理:最优贝尔曼公式

大纲 贝尔曼最优公式是贝尔曼公式的一个特殊情况,但其也非常重要。 本节课很重要的两个概念和一个工具: 工具不用多说,就是贝尔曼最优公式,概念则是 optimal state value(最优状态价值) 和 optimal polic…