1. 程式人生 > >lua table引用問題

lua table引用問題

引用 lua tables


一,基礎

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引用問題