我试图"跳过"一个变量,从未声明它或者只是立即收集垃圾,但我不知道它是否可能.
例:
function TestFunc()
return 1, 2
end
function SecondFunction()
local nodeclare, var = TestFunc()
end
Run Code Online (Sandbox Code Playgroud)
基本上我想要的是"nodeclare"甚至不存在.因此,如果我执行print(nodeclare,var),它将执行nil,2.如果我正在进行对循环并且我不需要使用keyvalue,那就是同样的事情.我可以将一些特殊的东西作为变量名称来实现吗?如果说我正在进行超过100个值的对循环,那么这甚至会产生显着的影响吗?
首先,变量不是垃圾收集,而是对象.在这种情况下,没有垃圾收集.
但是,假设TestFunc 是创建对象(比如表):
function TestFunc()
return {1}, {2}
end
function SecondFunction()
local nodeclare, var = TestFunc()
end
Run Code Online (Sandbox Code Playgroud)
现在nodeclare引用一个返回的表TestFunc.这是一个在堆上分配的对象,我们不想永远地闲逛.
如果没有任何东西引用它,最终将收集该对象.在您的情况下,一旦SecondFunction返回,本地nodeclare就会超出范围并消失.只要没有其他任何引用该表的内容,就会收集该表(在下一个收集周期中).
您可以nodeclare通过跳过第一个返回值来避免完全声明TestFunc:
local var = select(2, TestFunc())
Run Code Online (Sandbox Code Playgroud)
但是,当您谈论临时局部变量时,如您的示例中所示,通常只需创建临时变量然后忽略它.这避免了调用的开销select.有时你使用一个变量名来表明它是垃圾:
local _, var = TestFunc()
Run Code Online (Sandbox Code Playgroud)
如果说我正在进行超过100个值的对循环,那么这甚至会产生显着的影响吗?
没有任何.你只是不断地覆盖局部变量的值.
您具体指的是什么影响?记忆?表现?
根据《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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
541 次 |
| 最近记录: |