如何卸载/销毁lua脚本?

如何卸载/销毁lua脚本?

当您加载一个lua文件时,您实际上正在执行它的代码。它不像dll或其他语言中的东西:

int luaL_dofile (lua_State *L,const char *filename);

加载并运行给定的文件。它被定义为以下宏:

如果您的文件是这样的:

代码语言:javascript复制function sayHello()

print('Hello, world!')

end然后加载文件将在全局对象上创建一个函数“sayHello”。如果您再次加载该文件,它将用新函数替换现有函数,并且不会出现内存泄漏。任何调用'sayHello‘的人都将调用全局对象上的新函数,除非他们保存了对原始函数的引用。代码通常会这样做,因为调用局部变量比调用全局函数要快一些。例如,如果另一个文件的顶部有local sayhi = sayHello,那么任何对'sayhi‘的调用都会调用原始函数。

如果您正在创建类并期望数据保持不变,那么在重新加载之前创建的任何对象(lua表)仍将引用旧类的元类。新类的代码不会自动应用于重新加载之前创建的类。

举一个LUA文档中的例子:

代码语言:javascript复制Account = {}

function Account:deposit (v)

self.balance = self.balance + v

end

function Account:new (o)

o = o or {} -- create object if user does not provide one

setmetatable(o, self)

self.__index = self

return o

end

a = Account:new{balance = 0}

a:deposit(100.00)a现在是一个表,它的“余额”属性为100.00,一个元数据指向具有存款函数的帐户表。如果您更改了存款函数以打印余额并重新加载文件,它将替换全局“Account”表和函数,但是表“a”仍将保留原来的帐户表,因为它是可元的。因此,调用'a.deposit‘仍然不会打印值。

相关推荐

2022年11月25日 世界杯小组赛G组第1轮 巴西vs塞尔维亚 全场录像回放和集锦
用详细的数据诠释破甲弓+破军和破甲弓+黑切哪个伤害高?
关于虎头的成语(头形容老虎的成语有哪些)(31个)
鱼子酱吃多了会怎么样 鱼子酱可以经常吃吗

本文标签