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

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

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

好吧,它可以工作,但是在使用这个函数后,我的参数没有变成nil。可能我必须通过引用传递它,但我不确定在Corona中是否可能。

点赞
用户513763
用户513763

这个示例中所呈现的并不是很有意义。

你到底想要做什么?组件是全局的吗?还是表中的键?

在你的示例中,组件是一个函数中的本地变量。component = nil 只会将该变量中的值删除,因此会丢失它。

如果你想产生全局效果,你需要将想要消除的变量名称作为字符串传递进函数:

function removeComponent(component)
    if _G[component] then -- 在全局中存在?
         _G[component]:removeSelf()
    end
    _G[component] = nil
end

需要注意的是,这种编程方式(使用全局表来进行此类操作)通常不是一个好的方法。在最好的情况下,它可能会让你感到惊讶;在最坏的情况下,你会像消除 print 等标准函数一样.

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

2013-10-17 14:16:37
用户2633831
用户2633831

其实跟其他语言没什么不同。比如在 C++ 中,按引用传递一个值并不会阻止程序在其他地方持有该值的另一个副本。

我对 Corona 一无所知,但这实际上不是一个关于 Corona 的问题,更多地是一个 Lua 风格的问题。然而,如果我写了这个程序,我会确保 'component' userdata 或其基础值会自动清除。如果再次访问该 userdata,应该会抛出一个错误,指出重新使用了已死亡的 userdata。

2013-10-17 14:27:26
用户2893203
用户2893203

我写了这段代码:

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函数或者其他错误。需要看更多你的代码。

2013-10-18 10:58:07
用户375980
用户375980

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

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

然后像这样调用它:

a = removeComponent(a)

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

2014-03-15 15:03:38