首页 文章

lua不修改函数参数

提问于
浏览
1

我一直在学习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”中的空表,用于相同的目的 . 我究竟做错了什么?

3 回答

  • 1

    可能不需要通过新表初始化,而只需要设置其值 .

    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
    
  • 6

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

    试试这个:

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

    可以安全地认为,对于大多数情况,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 库来修改函数对象(例如更改up值),这可能会影响函数的执行方式,但是,再一次,您无法更改外部引用指向的位置 .

    字符串是不可变对象,你可以传递它们,有一个库可以为它们做些事情,但是那个库中的所有函数都返回新的字符串 . 因此,如果您尝试在函数内部使用"asda"字符串执行某些操作,则 b="asda" 中的外部变量 b 将再次受到影响 .

相关问题