让我们说我有一个简单的表,这个表里面有另一个包含其他值的表。 为简单起见,这里是布局:
local a = {b = {X = 123; Y = 321; Z = 456;}};
我有一个假设的函数来返回对表a.b中给定值的引用。
local function GetRef(member)
--return a reference to a.b[member]
end
我需要调用GetRef的原因是因为另一个调用它的函数需要能够为表中提供的值分配一个新值:
local function AssignValue(key, value)
local ref = GetRef(key);
ref = value;
end
现在你可以询问"为什么不返回ab,然后输入ref [key]来分配它?#34;和我可能这样做,但如果我决定实施我想要实现的方式,我现在不会学习任何新东西吗?
我将不胜感激。
由于
答案 0 :(得分:2)
Lua中没有对值的引用。
但你可以使用upvalues:
local function AssignValue(key, value)
a.b[key] = value
end
如果您想为多个表格执行此操作,请尝试
function makeSetPath(t)
return function (key,value) t[key]=value end
end
AssignValue = makeSetPath(a.b)
答案 1 :(得分:1)
说Lua没有参考资料并不完全正确。
实际上,每个变量都存储对某个值的引用。在内部有快捷方式,允许Lua直接在变量中存储简单值而不是引用它,但是你无法检查Lua方面是否属实,并且它并不重要。
重要的是,为变量分配新值只会更改存储在变量中的引用。它与Java非常相似 - 任何对象类型的变量都是引用,并在函数/方法中按值传递。因此,无法通过为变量赋值来改变值,您只能引用一些不同的值。
因此,要更改已存储的值,您必须明确地改变它。大多数Lua类型是不可变的(数字/布尔值/字符串),只留下表,线程和闭包作为可能更改的主题。这意味着您必须存储要变异的值。
根据您的示例,您无法通过引用存储在其中的某些值来更改表的内容。如果在local ref
变量中存储值321(Y索引),则不能改变它,因为数字是不可变的。为ref
变量分配新内容只会引用不同的值。您必须存储b
表的值才能在某个索引下分配新值,并且还需要存储该索引(或full path
,如@lhf已建议的那样。)