关于lua中引用和拷贝的问题

最近有很多同学问lua中 类型的 引用和拷贝的问题
我打算记录一下

Lua中基本类型分别为:nil、boolean、lightuserdata 、number、string、userdata、function、thread 、table;

从lua.h中可以看出

#define LUA_TNIL        0
#define LUA_TBOOLEAN        1
#define LUA_TLIGHTUSERDATA    2
#define LUA_TNUMBER        3
#define LUA_TSTRING        4
#define LUA_TTABLE        5
#define LUA_TFUNCTION        6
#define LUA_TUSERDATA        7
#define LUA_TTHREAD        8


```



(其中 number 在lua中叫实数,lua中没有整数, number其实是c/c++一个 double的类型。)



lua 中 table (和经过语法糖包装的table形式变量) 用 = 进行变量 赋值 都将会是引用,

其他都是拷贝(number, function等)。(若有错误,欢迎各位拍砖)

但是table有个例外

local t1 = {"table"}
local t2 = t1

t2 = nil 

这里不会影响t1.


```



部分测试代码 和结果:

local src = {"aa", "bb", "cc"}

local des = src

print("1 src :", table.concat(src, ", "))
print("1 des :", table.concat(des, ", "))

src = "dd"

print("2 src :", table.concat(src, ", "))
print("2 des :", table.concat(des, ", "))


des = "ee"

print("3 src :", table.concat(src, ", "))
print("3 des :", table.concat(des, ", "))

des = nil  


print("4 src :", table.concat(src or {"empty"}, ", "))
print("4 des :", table.concat(des or {"empty"}, ", "))





local fun1 = function(...)
    print("fun1", ...)
end

local fun2 = fun1

fun1("fun1")
fun2("fun2")

fun2 = function(...)
    print("fun2", ...)
end

fun1("fun1")
fun2("fun2")


```


luajit执行结果
1 src :    aa, bb, cc
1 des :    aa, bb, cc
2 src :    dd, bb, cc
2 des :    dd, bb, cc
3 src :    ee, bb, cc
3 des :    ee, bb, cc
4 src :    ee, bb, cc
4 des :    empty

fun1    fun1
fun1    fun2
fun1    fun1
fun2    fun2


lua VM对string 的管理机制为: string 永远只保留一份唯一 的copy。
所以 string使用 = 赋值操作,应该是 引用。 

如果想copy table,
 quick在functions.lua  提供了 clone()函数。

你如何证明string是引用?

string 不是拷贝,是引用
不好意思笔误了

我看也是。

受教了,但不知道要相信谁:9:

不好意思,有几处笔误,已修正

不知不觉,用quick-x已有半年,项目已接近尾声,从2.2.1升级到3.x。廖大一如既往给我们小白解惑。提升了很多。
一如这篇帖子。
只能说:解惑,廖大威武。
zrong,阳光七月,麒麟子等各位大神的讨论,让我们小白也受益匪浅,知道了如何思考一个问题,怎么追求完美的技术效果。
重要的是,各位有问必答,谦虚谨慎。
钦佩至极!

:866:

function也是引用呀


local fun1 = function(...)
    print("fun1", ...)
end
local fun2 = fun1
fun1("fun1")
fun2("fun2")
print(fun1, fun2)

输出


fun1 fun1
fun1 fun2
function: 0x7f9831409660 function: 0x7f9831409660

local src = “aa”
local dst = src
print(“src:”…src)
print(“dst:”…dst)
dst = “bb”
print(“src:”…src)
print(“dst:”…dst)

输出

src:aa
dst:aa
src:aa
dst:bb