0

我正在使用 Corona SDK。我想编写一个函数,它接收组件作为参数并像这样删除它:

function removeComponent(component)
    if component then component:removeSelf() end
    component = nil
end

好吧,它可以工作,但使用此函数后我的参数不会为零。可能我必须通过引用传递它,但我不确定 Corona 是否可行。

4

4 回答 4

4

如您的示例中所示,这实际上没有意义。

你到底想完成什么?组件是全局的吗?还是桌子上的钥匙?

在您的示例中,组件是函数中局部变量的名称。您component = nil只会从局部变量中删除值,因此会丢失。

如果您想获得全局效果,您需要将要消除的变量的名称作为字符串传递:

function removeComponent(component)
    if _G[component] then -- exists globally?
         _G[component]:removeSelf()
    end
    _G[component] = nil
end

请注意,这种编程风格(对这类事情使用全局表)通常不是一个好主意。在最好的情况下,它会让您感到惊讶,在最坏的情况下,您最终会将诸如标准功能之类的东西转换为打印。

因此,我建议将事物放在他们自己的表中,并将其传递给函数。

于 2013-10-17T14:16:37.070 回答
0

它与任何其他语言都没有什么不同。通过引用传递一个值(例如在 C++ 中)不会阻止任何程序在其他地方保存该相同值的另一个副本。

我对 Corona 一无所知,但这并不是一个真正的 Corona 问题,而是一个 Lua 风格的问题。但是,如果我写了它,我会确保“组件”用户数据或基础值会自行清除。如果再次访问用户数据,它应该会抛出一个错误,抱怨重新使用死用户数据。

于 2013-10-17T14:27:26.250 回答
0

我写了这段代码:

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 或其他东西。需要查看更多代码

于 2013-10-18T10:58:07.533 回答
0

Lua 不支持通过引用传递,但由于它支持返回值,因此您始终可以使用这种惯用方法实现您想要的:

function removeComponent(component)
    if component then component:removeSelf() end
    return nil
end

然后这样称呼它:

a = removeComponent(a)

编辑:同样值得指出的是,由于 Lua 支持多个返回值和多个赋值,因此您实际上不需要传递引用。如果您需要更新几个项目,请将它们传入并返回它们,然后调用 a,b = myFunction(a,b)

于 2014-03-15T15:03:38.907 回答