lua table引用问题
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,一,基础1,在lua中,table只是传递引用(即两个变量都指向同一片内存空间),所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。tb = {}tb.a = 11tb.b = 22
千家信息网最后更新 2025年12月02日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安全错误
数据库的锁怎样保障安全
南京数据库审计平台
主从数据库作用
基金项目开发用什么数据库
网络安全展架电力
计算机网络技术基础自测题
云企业服务器
服务器上跑
web服务器 nas
安徽峰泰软件开发有限公司
数据库同眇技术
杨浦区绿色软件开发项目信息
新服务器r740如何做raid
网络安全国外安全品牌
神州数码初级软件开发工程师
计算机网络安全大事件列举
华为网络技术大赛自测
安卓通讯录数据库目录
excel分类汇总数据库
医院网络安全设备申请
帝国神话自建服务器县城
服务器的部件
基金项目开发用什么数据库
自学软件开发去哪学
洛阳棋牌软件开发公司
设备网络安全近期价格
中国高校计算机大赛网络技术
网络安全工程师基础教程
网络安全证书不合格怎么办
电脑本地服务器连接失败咋回事
民政系统软件开发公司