lua table引用问题
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,一,基础1,在lua中,table只是传递引用(即两个变量都指向同一片内存空间),所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。tb = {}tb.a = 11tb.b = 22
千家信息网最后更新 2025年02月03日lua table引用问题
一,基础
1,在lua中,table只是传递引用(即两个变量都指向同一片内存空间),所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。
tb = {}tb.a = 11tb.b = 22tb_ref = tbfunction p(tip) print("--------------------------" .. tip) print("tb.a = " .. tb.a .. " " .. "tb.b = " .. tb.b) print("tb_ref.a = " .. tb_ref.a .. " " .. "tb_ref.b" .. tb_ref.b)endp("原始")tb_ref.a = 33p("修改了引用的a = 33,原来的a也变了")tb.b = 44p("修改了原始的b = 44,引用的b也变了")print("----------------------非表test")a = 1c = ac = 3print("a = " .. a)print("c = " .. c) 打印结果:--------------------------原始tb.a = 11 tb.b = 22tb_ref.a = 11 tb_ref.b22--------------------------修改了引用的a = 33,原来的a也变了tb.a = 33 tb.b = 22tb_ref.a = 33 tb_ref.b22--------------------------修改了原始的b = 44,引用的b也变了tb.a = 33 tb.b = 44tb_ref.a = 33 tb_ref.b44----------------------非表testa = 1c = 3
结果:
当改变表的一个值以后,它的引用的值也发生了变化;
对于非表的一般常数来说,它的赋值不存在引用的问题;
2,table存储
1)table里保存数据,数据可以是任何类型,包括function。
2)table里也可以保存table
3)key代表数据存储的位置
4)value就是用特定的key存储的数据
二,记录遇见的一个关于table的问题
代码如下:
local cjson = require("cjson")local t = {["GET"] = {["/a"] = "f"}}function hehe(node) node["TOKEN"] = node["TOKEN"] or {} ngx.log(ngx.ERR, "0", cjson.encode(t["GET"])) ngx.log(ngx.ERR, "0", cjson.encode(node)) ngx.log(ngx.ERR, "0", tostring(node)) node = node["TOKEN"] ngx.log(ngx.ERR, "1", cjson.encode(t["GET"])) ngx.log(ngx.ERR, "1", cjson.encode(node)) ngx.log(ngx.ERR, "1", tostring(node)) node["TOKEN"] = "123" ngx.log(ngx.ERR, "2", cjson.encode(t["GET"])) ngx.log(ngx.ERR, "2", cjson.encode(node)) ngx.log(ngx.ERR, "2", tostring(node))endhehe(t["GET"])ngx.say("ok")
nginx日志中的结果:
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):8: hehe(): 0{"\/a":"f","TOKEN":{}}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):9: hehe(): 0{"\/a":"f","TOKEN":{}}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):10: hehe(): 0table: 0x41dfca60, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):13: hehe(): 1{"\/a":"f","TOKEN":{}}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):14: hehe(): 1{}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):15: hehe(): 1table: 0x41e011e0, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):18: hehe(): 2{"\/a":"f","TOKEN":{"TOKEN":"123"}}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):19: hehe(): 2{"TOKEN":"123"}, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):20: hehe(): 2table: 0x41e011e0, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"
结果分析:
1,lua中table相关操作包括做为function的参数都是引用操作,在function中对table node的key,value的相关操作都是对原table t的操作;
2,node = node["TOKEN"] 这一步操作相当于把node的内存地址指向了node["TOKEN"]的内存地址(即t["GET"]["TOKEN"]的内存地址),故之后对node的操作,都会影响到t["GET"]["TOKEN"]。
原始
内存
数据
结果
地址
存储
问题
两个
指向
代码
代表
位置
参数
变量
只是
基础
就是
常数
日志
空间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
全国乡镇数据库
富士康有软件开发部门吗
杭州三信网络技术有限公司
网络安全与信息化相辅相成
收银机数据库坏
软件开发者好不好
软件开发人员要做什么
kafka服务器硬件配置
信息安全 网络安全与执法
app软件开发sh
模块化软件开发技术
wpf图片上传到数据库
sap软件开发怎么样
内蒙古技能人才实名制数据库
未能找到机主服务器指定名
嵌入式软件开发的好处
网络时间服务器开发
南通app软件开发大概多少钱
软件开发所用到技术
如何将数据库表中信息插入临时表
灰烬使者服务器英文名
网络安全产品评测
网络安全专业哪些学校好
网络安全自评估报告
券商软件开发
数据库约束条件字段长度
怎么找到数据库的快捷方式
会话管理云服务器
数据所网络安全部张万能
网络安全意味着什么