gpt4 book ai didi

Lua 模拟 require 函数

转载 作者:行者123 更新时间:2023-12-04 17:45:18 29 4
gpt4 key购买 nike

在嵌入式 lua 环境(魔兽世界 - 魔兽世界)中缺少 require功能。

我想要移植一个现有的 lua 源代码 ( an great OO-library ) 以在 WoW 中使用它。库本身相对较小(大约 8 个小文件),但当然它大量使用了 require .

《魔兽世界》通过在 XML 文件中定义文件和库来加载文件和库,例如:

<Ui xsi:schemaLocation="http://www.blizzard.com/wow/ui/">
<Script file="LibOne.lua"/>
<Script file="LibTwo.lua"/>
</Ui>

但我不知道低级库操作是如何在 WoW 中完成的。

WoW 中的 AFAIK 甚至丢失了 package.表也​​。 :(

所以问题:对我来说,简化的方法是编写一个模拟 require 的函数。功能使用魔兽世界中可用的界面。问题是如何。有人可以给我一些指示吗?

或者作为替代方案,为了将提到的现有源移植到 WoW,我需要替换 require Some.Other.Module lua 源代码中的行是 WoW 可以理解的。此类 require Some.Module 的等价物/替代品是什么?在魔兽?

魔兽世界如何处理低级别的模块/库?

最佳答案

您可以使用各种合并脚本之一将所有文件合并为一个,例如 amalg .然后你可以加载这个文件和一个实现 require 的 stub 。使用通常的 WoW 方式执行功能:

<Ui xsi:schemaLocation="http://www.blizzard.com/wow/ui/">
<Script file="RequireStub.lua"/>
<Script file="AllModules.lua"/><!-- amalgamated Lua modules -->
<Script file="YourCode.lua"/>
</Ui>

文件 RequireStub.lua可能看起来像:
package = {}
local preload, loaded = {}, {
string = string,
debug = debug,
package = package,
_G = _G,
io = io,
os = os,
table = table,
math = math,
coroutine = coroutine,
}
package.preload, package.loaded = preload, loaded


function require( mod )
if not loaded[ mod ] then
local f = preload[ mod ]
if f == nil then
error( "module '"..mod..[[' not found:
no field package.preload[']]..mod.."']", 1 )
end
local v = f( mod )
if v ~= nil then
loaded[ mod ] = v
elseif loaded[ mod ] == nil then
loaded[ mod ] = true
end
end
return loaded[ mod ]
end

这应该足以模拟 package图书馆为您提供工作 require在合并文件中加载模块。不同的合并脚本可能需要来自 package 的不同位,但是,因此您可能必须查看生成的 Lua 源代码。

Coat 的具体情况下您可能还需要为其他 Lua 函数实现 stub 。例如。我看过 Coat使用 debug图书馆 ...

关于Lua 模拟 require 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36871859/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com