【问题标题】:Lua deconstruct and nil through functionLua通过函数解构和nil
【发布时间】:2013-12-21 17:21:48
【问题描述】:

我想在 Lua 中“解构”(如果这是正确的话)我的对象。

这是我的问题,是否有解决方案(或解决问题的正确方法)?

function k(o)
    o = nil
end

o = 20
print(o) --> 20

k(o)
print(o) --> 20, should be nil

【问题讨论】:

  • 你真正想要完成什么?
  • @lhf 我希望将ent[#ent]:kill() ent[#ent] = nil 整理成actor.destroy(ent[#ent]),即function actor.destroy(o) o:kill() o = nil end。我想在通过元表过程创建对象后创建一个销毁对象的简洁方法。
  • 将签名设为function actor.destroy(c,i) c[i]:kill() c[i] = nil end 并将actor.destroy(ent[#ent]) 更改为actor.destroy(ent,#ent)

标签: function oop object lua null


【解决方案1】:

如果你把你的变量放在(全局)环境中而不用“local”声明它们,你可以通过将它们的名字传递给函数来设置它们。

---[[ if lua < 5.2
  local _ENV = _G
---]]

function k(n)
  _ENV[n] = nil
end

o = 20
print(o) --> 20

k('o')
print(o) --> nil

一般来说,当你想改变一个成员时,你需要它的容器和索引。

【讨论】:

  • 出于审美目的,是否可以将k('o') 设为k(o)
  • 不,尽管您可以使用k'o'k"o"k[[o]]
  • 你也可以使用k = setmetatable({}, {__index=function(_,n) _ENV[n] = nil end}) 来杀死像k.o 这样的索引语句,但你会想在之后刷牙,因为这会滥用句法糖,复杂到足以给你蛀牙。
【解决方案2】:

你想做的事情不能在函数中完成,因为 Lua 是按值传递参数的。您必须使用直接分配。

【讨论】:

    【解决方案3】:

    在 Lua 中,对象是垃圾回收的,因此您无法控制“解构”(也称为终结或垃圾回收;在 c++ 中称为销毁,但这并不完全相同)。

    所以这取决于你想要做什么,但是如果你试图释放 o 持有的资源,那么将 o 设置为 nil 是不够的,因为如果任何其他表或模块引用了 o,它不会最终确定。您可以向它添加一个“finalize”方法并调用它,但是您需要验证代码的其他部分是否遵守此“finalization”协定:通过检查 o 的每个方法以确保它没有被敲定。

    例如,如果 o 有一个方法“init”来初始化一个新实例,一个方法“doSomething”来做某事,还有一个方法“finalize”来释放资源,那么在 o:finalize() 中设置“self. finalized = true" 并在 o:doSomething() 中放入“if self.finalized then error("message") end”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-08
      • 2018-09-16
      • 2023-03-04
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2018-08-06
      相关资源
      最近更新 更多