网站建设资讯

NEWS

网站建设资讯

luatable引用问题-创新互联

一,基础

成都创新互联公司专注于扶绥网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供扶绥营销型网站建设,扶绥网站制作、扶绥网页设计、扶绥网站官网定制、小程序设计服务,打造扶绥网络公司原创品牌,更为您提供扶绥网站排名全网营销落地服务。

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") 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)) end hehe(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"]。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:luatable引用问题-创新互联
网站地址:http://cdweb.net/article/dsoohd.html