天天看点

lua table引用问题

一,基础

1,在lua中,table只是传递引用(即两个变量都指向同一片内存空间),所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<code>tb = {}</code>

<code>tb.a = 11</code>

<code>tb.b = 22</code>

<code>tb_ref = tb</code>

<code>function p(tip)</code>

<code>  </code><code>print(</code><code>"--------------------------"</code>  <code>.. tip)</code>

<code>  </code><code>print(</code><code>"tb.a = "</code> <code>.. tb.a .. </code><code>"    "</code> <code>.. </code><code>"tb.b = "</code> <code>.. tb.b)</code>

<code>  </code><code>print(</code><code>"tb_ref.a = "</code> <code>.. tb_ref.a .. </code><code>"    "</code> <code>.. </code><code>"tb_ref.b"</code> <code>.. tb_ref.b)</code>

<code>end</code>

<code>p(</code><code>"原始"</code><code>)</code>

<code>tb_ref.a = 33</code>

<code>p(</code><code>"修改了引用的a = 33,原来的a也变了"</code><code>)</code>

<code>tb.b = 44</code>

<code>p(</code><code>"修改了原始的b = 44,引用的b也变了"</code><code>)</code>

<code>print(</code><code>"----------------------非表test"</code><code>)</code>

<code>a = 1</code>

<code>c = a</code>

<code>c = 3</code>

<code>print(</code><code>"a = "</code> <code>.. a)</code>

<code>print(</code><code>"c = "</code> <code>.. c) </code>

<code>打印结果:</code>

<code>--------------------------原始</code>

<code>tb.a = 11    tb.b = 22</code>

<code>tb_ref.a = 11    tb_ref.b22</code>

<code>--------------------------修改了引用的a = 33,原来的a也变了</code>

<code>tb.a = 33    tb.b = 22</code>

<code>tb_ref.a = 33    tb_ref.b22</code>

<code>--------------------------修改了原始的b = 44,引用的b也变了</code>

<code>tb.a = 33    tb.b = 44</code>

<code>tb_ref.a = 33    tb_ref.b44</code>

<code>----------------------非表test</code>

结果:  

当改变表的一个值以后,它的引用的值也发生了变化;

对于非表的一般常数来说,它的赋值不存在引用的问题;

2,table存储

1)table里保存数据,数据可以是任何类型,包括function。 

2)table里也可以保存table 

3)key代表数据存储的位置

4)value就是用特定的key存储的数据 

二,记录遇见的一个关于table的问题

代码如下:

<code>local cjson = require(</code><code>"cjson"</code><code>)</code>

<code>local t = {[</code><code>"GET"</code><code>] = {[</code><code>"/a"</code><code>] = </code><code>"f"</code><code>}}</code>

<code>function hehe(node)</code>

<code>   </code><code>node[</code><code>"TOKEN"</code><code>] = node[</code><code>"TOKEN"</code><code>] or {}</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"0"</code><code>, cjson.encode(t[</code><code>"GET"</code><code>]))</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"0"</code><code>, cjson.encode(node))</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"0"</code><code>, tostring(node))</code>

<code>   </code><code>node = node[</code><code>"TOKEN"</code><code>]</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"1"</code><code>, cjson.encode(t[</code><code>"GET"</code><code>]))</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"1"</code><code>, cjson.encode(node))</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"1"</code><code>, tostring(node))</code>

<code>   </code><code>node[</code><code>"TOKEN"</code><code>] = </code><code>"123"</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"2"</code><code>, cjson.encode(t[</code><code>"GET"</code><code>]))</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"2"</code><code>, cjson.encode(node))</code>

<code>   </code><code>ngx.</code><code>log</code><code>(ngx.ERR, </code><code>"2"</code><code>, tostring(node))</code>

<code>hehe(t[</code><code>"GET"</code><code>])</code>

<code>ngx.say(</code><code>"ok"</code><code>)</code>

nginx日志中的结果:

<code>2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):8: hehe(): 0{</code><code>"\/a"</code><code>:</code><code>"f"</code><code>,</code><code>"TOKEN"</code><code>:{}}, client: 127.0.0.1, server: , request: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

<code>2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):9: hehe(): 0{</code><code>"\/a"</code><code>:</code><code>"f"</code><code>,</code><code>"TOKEN"</code><code>:{}}, client: 127.0.0.1, server: , request: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

<code>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: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

<code>2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):13: hehe(): 1{</code><code>"\/a"</code><code>:</code><code>"f"</code><code>,</code><code>"TOKEN"</code><code>:{}}, client: 127.0.0.1, server: , request: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

<code>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: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

<code>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: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

<code>2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):18: hehe(): 2{</code><code>"\/a"</code><code>:</code><code>"f"</code><code>,</code><code>"TOKEN"</code><code>:{</code><code>"TOKEN"</code><code>:</code><code>"123"</code><code>}}, client: 127.0.0.1, server: , request: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

<code>2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):19: hehe(): 2{</code><code>"TOKEN"</code><code>:</code><code>"123"</code><code>}, client: 127.0.0.1, server: , request: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

<code>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: </code><code>"GET / HTTP/1.1"</code><code>, host: </code><code>"127.0.0.1:8888"</code>

结果分析:

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"]。

本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/1945378,如需转载请自行联系原作者