Lua:跳过变量声明

时间:2014-02-27 20:04:28

标签: lua

我试图“跳过”一个变量,要么从不声明它,要么只是立即收集垃圾,但我不知道它是否可能。

示例:

function TestFunc()
   return 1, 2
end

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

基本上我想要的是“nodeclare”甚至不存在。所以,如果我打印(nodeclare,var),它将为nil,2。 同样的事情是,如果我做一个对循环,我不需要使用keyvalue。 我可以将一些特殊的东西作为变量名称来实现吗?如果说我正在进行超过100个值的对循环,那是否会产生显着的影响?

2 个答案:

答案 0 :(得分:6)

首先,变量不是垃圾回收,对象。在这种情况下,没有垃圾收集。

但是,假设TestFunc 创建对象(比如表格):

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

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

现在nodeclare引用了TestFunc返回的表格。这是一个在堆上分配的对象,我们不想永远地闲逛。

最终将收集该对象如果没有任何内容可以引用它。在您的情况下,只要SecondFunction返回,本地nodeclare就会超出范围并消失。只要没有 else 引用该表,就会收集该表(在下一个收集周期中)。

您可以通过跳过nodeclare的第一个返回值来避免完全声明TestFunc

local var = select(2, TestFunc())

但是,当您谈论临时局部变量时,如您的示例中所示,通常只需创建临时变量然后忽略它。这可以避免调用select的开销。有时你使用一个变量名来表明它是垃圾:

local _, var = TestFunc()

  

如果说我正在做超过100个值的对循环,那是否会产生显着的影响?

无论如何。你只是不断覆盖局部变量的值。

答案 1 :(得分:1)

你的意思究竟是什么?记忆?性能?

根据Programming in Lua书,您可以跳过第二个返回值,但不要忽略第一个并使用第二个:

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'