我一直在学习lua,似乎无法对这种二叉树进行简单的实现...
function createTree(tree, max)
if max > 0 then
tree = {data = max, left = {}, right = {}}
createTree(tree.left, max - 1)
createTree(tree.right, max - 1)
end
end
function printTree(tree)
if tree then
print(tree.data)
printTree(tree.left)
printTree(tree.right)
end
end
tree = {}
createTree(tree, 3)
printTree(tree)
该程序执行后仅返回nil。我在网上搜索以了解参数传递在lua中是如何工作的(如果是通过引用或通过值),并发现某些类型是通过引用(例如表和函数)传递的,而其他类型是通过值传递的。尽管如此,在将全局变量“ tree”传递给“ createTree”函数之前,我还是将其做成了表,并且出于相同的目的,我甚至将“ left”和“ right”初始化为“ createTree”内部的空表。我究竟做错了什么?
可以肯定地认为,在大多数情况下,lua通过值传递参数。但是对于除数字以外的任何对象(数字实际上不是对象),“值”实际上是指向所述对象的指针。
当您执行类似a={1,2,3}
或b="asda"
的操作时,右侧的值将动态分配到某个位置,a
并且b
仅获取这些地址。因此,当您传递a
给函数时fun(a)
,指针将被复制到函数内部的新变量,但其a
自身不受影响:
function fun(p)
--p stores address of the same object, but `p` is not `a`
p[1]=3--by using the address you can
p[4]=1--alter the contents of the object
p[2]=nil--this will be seen outside
q={}
p={}--here you assign address of another object to the pointer
p=q--(here too)
end
函数也由指向它们的指针表示,您可以使用debug
库修改函数对象(例如,更改升值),这可能会影响函数的执行方式,但是再次,您不能更改外部引用指向的位置。
字符串是不可变的对象,您可以传递它们,有一个可以对它们进行填充的库,但是该库中的所有函数都返回新的字符串。因此,如果您尝试对函数中的“ asda”字符串进行操作,则b
from的外部变量b="asda"
不会受到影响。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句