Lua:跳过变量声明
我试图“跳过”一个变量,或者从不声明它,或者只是让它立即被垃圾回收,但我不知道这是否可能 例如:Lua:跳过变量声明,lua,Lua,我试图“跳过”一个变量,或者从不声明它,或者只是让它立即被垃圾回收,但我不知道这是否可能 例如: function TestFunc() return 1, 2 end function SecondFunction() local nodeclare, var = TestFunc() end 基本上我想要的是“nodecare”根本不存在。所以,如果我打印了(nodeclare,var),它将是nil,2。 如果我在做一个pairs循环,并且不需要使用keyvalue,同样的
function TestFunc()
return 1, 2
end
function SecondFunction()
local nodeclare, var = TestFunc()
end
基本上我想要的是“nodecare”根本不存在。所以,如果我打印了(nodeclare,var),它将是nil,2。
如果我在做一个pairs循环,并且不需要使用keyvalue,同样的事情也会发生。
有什么特殊的东西可以作为变量名来实现这一点吗?如果说我对100个值进行配对循环,这会产生重大影响吗?你的确切意思是什么?记忆?表演 根据这本书,您可以略过第二个返回值,但不能忽略第一个并使用第二个:
x,y = foo2() -- x='a', y='b'
x = foo2() -- x='a', 'b' is discarded
x,y,z = 10,foo2() -- x=10, y='a', z='b'
首先,变量不是垃圾收集的,对象是垃圾收集的。在这种情况下,没有垃圾收集 但是,假设
TestFunc
正在创建对象(比如表):
现在,nodeclare
正在引用由TestFunc
返回的表。这是一个在堆上分配的对象,我们不希望永远挂在那里
如果没有任何东西可以引用该对象,则最终将收集该对象。在您的情况下,只要SecondFunction
返回,本地nodeclare
就会超出范围并消失。只要没有其他东西引用该表,就将收集该表(在下一个收集周期中)
通过跳过TestFunc
的第一个返回值,可以避免完全声明nodeclare
,如下所示:
local var = select(2, TestFunc())
但是,当您讨论临时局部变量时,如您的示例中所示,您通常只创建临时变量,然后忽略它。这避免了调用select
的开销。有时您使用一个变量名来表示它是垃圾:
local _, var = TestFunc()
如果说我在对100个值进行pairs循环,那会有显著的影响吗
一点也没有。您只是在不断地覆盖局部变量的值。我实际上已经在这样做了,但我假设当变量超出范围时,在某个时候会受到影响。我基本上需要在一个每帧最多包含200个对象的表中循环,我想也许可以保存200个变量声明和200个超出范围的变量(如果它们没有声明,就不能成为un gc的upvalues)我想你不必担心——Lua设计得非常好,是迄今为止最快的解释语言。编辑了我之前的评论。我明白了。也许您可以重写函数,使其只返回您使用的值?如果你的意思是
pairs()
,你不必担心,因为据我所知,它只返回对键和值的引用。我很确定它们实际上声明了局部命名变量,因为如果你将这些变量设置为某个值,表将不受影响,当超出范围时,你可以将它们作为upvalues传递,但这里有一个陷阱。如果在循环中调用此函数,请在循环外声明局部变量。否则,您将不覆盖本地文件,而是对其进行阴影处理,这将为GC提供更多的工作。@catwell我还没有听说过这一点。你能详细说明吗?@catwell不,不能。Lua使用基于寄存器的VM;即使内部变量与外部变量有阴影,每个变量都被分配一个寄存器,并且这个分配不能更改。正如Mud所说,变量不是GC'd。@ColonelThirtyTwo您是对的,实际上,相同的寄存器将被重复使用,因此没有任何区别。虽然从技术上讲,它不是同一个变量,但它只在创建闭包时起作用。我在这里做了一个要点:
local _, var = TestFunc()