繁体   English   中英

lua不修改函数参数

[英]lua not modifying function arguments

我一直在学习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”内部的空表。 我究竟做错了什么?

可能有必要不通过新表进行初始化,而仅通过设置其值进行初始化。

function createTree(tree, max)
    if max > 0 then
        tree.data = max
        tree.left = {}
        tree.right = {}
        createTree(tree.left, max - 1)
        createTree(tree.right, max - 1)
    end
end

在Lua中,参数按值传递。 分配给参数不会更改原始变量。

尝试这个:

function createTree(max)
    if max == 0 then
        return nil
     else
        return {data = max, left = createTree(max-1), right = createTree(max-1)}
     end
end

可以肯定地认为,在大多数情况下,lua会按值传递参数。 但是对于除数字以外的任何对象(数字实际上不是对象),“值”实际上是指向所述对象的指针。

当您执行类似a={1,2,3}b="asda"的操作时,右侧的值会动态分配到某个位置,而ab仅获得这些地址。 因此,当您将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="asda"外部变量b不会再次受到影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM