我正在使用 Corona SDK。我想编写一个函数,它接收组件作为参数并像这样删除它:
function removeComponent(component)
if component then component:removeSelf() end
component = nil
end
好吧,它可以工作,但使用此函数后我的参数不会为零。可能我必须通过引用传递它,但我不确定 Corona 是否可行。
如您的示例中所示,这实际上没有意义。
你到底想完成什么?组件是全局的吗?还是桌子上的钥匙?
在您的示例中,组件是函数中局部变量的名称。您component = nil
只会从局部变量中删除值,因此会丢失。
如果您想获得全局效果,您需要将要消除的变量的名称作为字符串传递:
function removeComponent(component)
if _G[component] then -- exists globally?
_G[component]:removeSelf()
end
_G[component] = nil
end
请注意,这种编程风格(对这类事情使用全局表)通常不是一个好主意。在最好的情况下,它会让您感到惊讶,在最坏的情况下,您最终会将诸如标准功能之类的东西转换为打印。
因此,我建议将事物放在他们自己的表中,并将其传递给函数。
它与任何其他语言都没有什么不同。通过引用传递一个值(例如在 C++ 中)不会阻止任何程序在其他地方保存该相同值的另一个副本。
我对 Corona 一无所知,但这并不是一个真正的 Corona 问题,而是一个 Lua 风格的问题。但是,如果我写了它,我会确保“组件”用户数据或基础值会自行清除。如果再次访问用户数据,它应该会抛出一个错误,抱怨重新使用死用户数据。
我写了这段代码:
local component = display.newCircle(100, 100, 100);
local function removeComponent(c)
if component then component:removeSelf() end
component = nil
end
removeComponent(component)
if component == nil then print("Component is nil") else print("Component is not nil") end
它打印“组件为零”。也许您在其他地方有您的组件的副本,或者您可能忘记调用函数 removeComponent 或其他东西。需要查看更多代码
Lua 不支持通过引用传递,但由于它支持返回值,因此您始终可以使用这种惯用方法实现您想要的:
function removeComponent(component)
if component then component:removeSelf() end
return nil
end
然后这样称呼它:
a = removeComponent(a)
编辑:同样值得指出的是,由于 Lua 支持多个返回值和多个赋值,因此您实际上不需要传递引用。如果您需要更新几个项目,请将它们传入并返回它们,然后调用 a,b = myFunction(a,b)