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)
程序执行后 returns nil。我在网上搜索以了解参数传递在 lua 中是如何工作的(如果它是通过引用或通过值)并发现某些类型是通过引用传递的(例如 table 和函数)而其他人则按价值。尽管如此,在将全局变量 "tree" 传递给 "createTree" 函数之前,我将其设为 table,甚至将 "left" 和 "right" 初始化为空 tables inside "createTree" 出于同样的目的。我做错了什么?
在Lua中,参数是按值传递的。分配给参数不会更改原始变量。
试试这个:
function createTree(max)
if max == 0 then
return nil
else
return {data = max, left = createTree(max-1), right = createTree(max-1)}
end
end
可能需要不通过新的 table 进行初始化,而只是设置其值。
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 可以安全地认为按值传递参数。但是对于数字以外的任何对象(数字实际上不是对象), "value" 实际上是指向所述对象的指针。
当您执行类似 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
库来修改函数对象(例如更改上值),这可能会影响函数的执行方式,但是,再一次,您不能更改外部引用指向的位置。
字符串是不可变的对象,您可以传递它们,有一个库可以对它们进行操作,但是该库中的所有函数 return 都是新字符串。因此,如果您尝试在函数内部使用 "asda" 字符串执行某些操作,来自 b="asda"
的外部变量 b
将不会受到影响。
我一直在学习 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)
程序执行后 returns nil。我在网上搜索以了解参数传递在 lua 中是如何工作的(如果它是通过引用或通过值)并发现某些类型是通过引用传递的(例如 table 和函数)而其他人则按价值。尽管如此,在将全局变量 "tree" 传递给 "createTree" 函数之前,我将其设为 table,甚至将 "left" 和 "right" 初始化为空 tables inside "createTree" 出于同样的目的。我做错了什么?
在Lua中,参数是按值传递的。分配给参数不会更改原始变量。
试试这个:
function createTree(max)
if max == 0 then
return nil
else
return {data = max, left = createTree(max-1), right = createTree(max-1)}
end
end
可能需要不通过新的 table 进行初始化,而只是设置其值。
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 可以安全地认为按值传递参数。但是对于数字以外的任何对象(数字实际上不是对象), "value" 实际上是指向所述对象的指针。
当您执行类似 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
库来修改函数对象(例如更改上值),这可能会影响函数的执行方式,但是,再一次,您不能更改外部引用指向的位置。
字符串是不可变的对象,您可以传递它们,有一个库可以对它们进行操作,但是该库中的所有函数 return 都是新字符串。因此,如果您尝试在函数内部使用 "asda" 字符串执行某些操作,来自 b="asda"
的外部变量 b
将不会受到影响。