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()