Lua 中不修改函数参数

我正在学习 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" 函数,并在 "createTree" 中初始化 "left" 和 "right" 为空表格以达到同样的目的。我错在哪里了?

点赞
用户107090
用户107090

在 Lua 中,参数是按值传递的。向一个参数分配值不会改变原始变量。

尝试这个:

function createTree(max)
    if max == 0 then
        return nil
     else
        return {data = max, left = createTree(max-1), right = createTree(max-1)}
     end
end
2017-05-04 19:38:23
用户7504558
用户7504558

可能不需要使用一个新的表来初始化,只需设置其值即可。

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
2017-05-04 19:44:24
用户4687565
用户4687565

可以安全地认为,在大多数情况下,lua是按值传递参数的。但对于除数字之外的任何对象(实际上数字并不是对象),"值"实际上是指向该对象的指针。

当你做类似 a = {1,2,3}b = "asda" 这样的事情时,右边的值动态分配在某个地方,而 ab 只得到了这些地址。因此,当你将 a 传递给函数 fun(a) 时,指针被复制到函数内部的一个新变量中,但 a 本身不受影响:

function fun(p)
   --p存储的是相同对象的地址,但`p`不是`a`
   p[1]=3--使用地址可以更改对象的内容
   p[4]=1--这将在外部看到

   q={}
   p={}--这里你将另一个对象的地址赋给指针
   p=q--(这里也是)
end

函数也是用指向它们的指针表示的,你可以使用debug库来调整函数对象(例如改变闭包变量),这可能会影响函数的执行,但是,再次强调,你无法更改外部引用指向的位置。

字符串是不可变的对象,你可以传递它们,有一个库会对它们进行操作,但是该库中的所有函数都会返回新字符串。因此,再次强调,如果你尝试在函数内部对 "asda" 字符串进行操作,外部变量 bb="asda" 不会受到影响。

2017-05-06 22:09:29