首页 > 代码库 > lua table引用问题
lua table引用问题
一,基础
1,在lua中,table只是传递引用,所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。
tb = {} tb.a = 11 tb.b = 22 tb_ref = tb function 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) end p("原始") tb_ref.a = 33 p("修改了引用的a = 33,原来的a也变了") tb.b = 44 p("修改了原始的b = 44,引用的b也变了") print("----------------------非表test") a = 1 c = a c = 3 print("a = " .. a) print("c = " .. c) 打印结果: --------------------------原始 tb.a = 11 tb.b = 22 tb_ref.a = 11 tb_ref.b22 --------------------------修改了引用的a = 33,原来的a也变了 tb.a = 33 tb.b = 22 tb_ref.a = 33 tb_ref.b22 --------------------------修改了原始的b = 44,引用的b也变了 tb.a = 33 tb.b = 44 tb_ref.a = 33 tb_ref.b44 ----------------------非表test a = 1 c = 3
结果:
当改变表的一个值以后,它的引用的值也发生了变化;
对于非表的一般常数来说,它的赋值不存在引用的问题;
2,table存储
1)table里保存数据,数据可以是任何类型,包括function。
2)table里也可以保存table
3)key代表数据存储的位置
4)value就是用特定的key存储的数据
二,记录遇见的一个关于table的问题
代码如下:
local cjson = require("cjson.safe") function hehe(node) node["TOKEN"] = node["TOKEN"] or {} ngx.log(ngx.ERR, cjson.encode(node), "0", tostring(node)) node = {} ngx.log(ngx.ERR, cjson.encode(node), "1", tostring(node)) end local t = {["GET"] = {["/a"] = "f"}} hehe(t) ngx.log(ngx.ERR, cjson.encode(t), "2", tostring(t)) ngx.say("ok")
nginx日志中的结果:
2017/07/07 16:29:34 [error] 6183#0: *695 [lua] access_by_lua(nginx.conf:128):6: hehe(): {"TOKEN":{},"GET":{"\/a":"f"}}0table: 0x41383288, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888" 2017/07/07 16:29:34 [error] 6183#0: *695 [lua] access_by_lua(nginx.conf:128):8: hehe(): {}1table: 0x4138ace0, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888" 2017/07/07 16:29:34 [error] 6183#0: *695 [lua] access_by_lua(nginx.conf:128):13: {"TOKEN":{},"GET":{"\/a":"f"}}2table: 0x41383288, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8888"
结果分析:
lua中table相关操作包括做为function的参数都是引用操作,在function中对table node的key,value的相关操作都是对原table t的操作;
node = {}操作也是引用操作,node变量的内存地址指向空table {}的内存地址,则table node的内存地址就和table t的不一样了,这个操作并不会影响table t;
本文出自 “佳” 博客,请务必保留此出处http://leejia.blog.51cto.com/4356849/1945378
lua table引用问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。