如何在Corona中通过引用传递变量

时间:2013-10-17 11:46:15

标签: lua corona

我正在使用Corona SDK。 我想编写一个接收组件作为参数的函数,并将其删除:

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

嗯,它有效,但使用此功能后我的参数不会为零。可能我必须通过引用传递它,但我不确定Corona是否可能。

4 个答案:

答案 0 :(得分:4)

如您的示例中所示,这没有任何意义。

你到底想要完成什么?组件是全球性的吗?或表中的一个键?

在您的示例中,component是函数中局部变量的名称。 <{1}}只会从局部变量中删除值,因此会丢失。

如果你想拥有全局效果,你需要传递你想要消除的变量的名称作为字符串:

component = nil

请注意,这种编程风格(使用全局表格进行此类操作)通常不是一个好主意。在最好的情况下,它会给你带来惊喜,在最糟糕的情况下,你最终会将标准函数之类的东西称为打印。

因此,我建议在自己的表中使用puttign,并将其传递给函数。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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

并打印“Component is nil”。也许你有一个组件的副本,或者你可能忘记调用函数removeComponent或其他东西。需要查看更多代码

答案 3 :(得分:0)

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

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

然后像这样称呼它:

a = removeComponent(a)

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