Lua:跳过变量声明

我想要“跳过”一个变量,通过从未声明它或立即进行垃圾回收来实现,但我不知道是否可能。

例如:

function TestFunc()
   return 1, 2
end

function SecondFunction()
   local nodeclare, var = TestFunc()
end

基本上,我想让“nodeclare”甚至不存在。所以如果我打印(nodeclare,var)它会做nil,2。 如果我正在进行一个对100个值的pairs循环,并且我不需要使用keyvalue,那么同样的事情也会发生。 我是否可以将某些特殊的东西作为变量名来实现这一点?如果我正在进行一次对100个值的pairs循环,那是否会产生重大影响?

点赞
用户61479
用户61479

你具体指的是什么影响?内存?性能?

根据《Lua 编程》一书,你可以跳过第二个返回值,但不能忽略第一个并使用第二个:

x,y = foo2()        -- x='a', y='b'
x = foo2()          -- x='a','b' 被丢弃
x,y,z = 10,foo2()   -- x=10, y='a', z='b'
2014-02-27 20:11:04
用户501459
用户501459

首先,变量不会被垃圾回收,_对象_会。在这种情况下,没有什么可进行垃圾回收的。

然而,假设TestFunc正在创建对象(比如表):

function TestFunc()
   return {1}, {2}
end

function SecondFunction()
   local nodeclare, var = TestFunc()
end

现在,nodeclare正在引用TestFunc返回的一个表。这是一个在堆上分配的对象,我们不希望它永远挂在那里。

如果没有任何引用该对象,它最终将被收集。在你的情况下,只要SecondFunction返回,本地的nodeclare就会超出作用范围并消失。只要没有其他东西引用该表,该表将在下一个收集周期中被收集。

你可以通过跳过以下方式完全省略声明 nodeclare,从而避免这种情况: TestFunc 的第一个返回值:

local var = select(2, TestFunc())

然而,在你的例子中,当你谈论一个临时本地变量时,通常只是创建临时变量然后忽略它。这样可以避免调用select带来的开销。有时,你可以使用一个表明它是垃圾的变量名:

local _, var = TestFunc()

如果我正在对100个值进行pairs循环,这是否会产生显著的影响?

没有任何影响。你只是不断覆盖本地变量的值。

2014-02-27 22:22:37