caj*_*ine 5 lua world-of-warcraft
在嵌入式lua环境(魔兽世界 - 魔兽世界)中缺少这个require功能.
我希望端口一个现有的lua源代码(一个很棒的OO库)供在WoW中使用它.图书馆本身相对较小(约8个小文件)但当然它大量使用require.
魔兽世界通过在XML文件中定义文件和库来加载文件和库,如:
<Ui xsi:schemaLocation="http://www.blizzard.com/wow/ui/">
<Script file="LibOne.lua"/>
<Script file="LibTwo.lua"/>
</Ui>
Run Code Online (Sandbox Code Playgroud)
但我不知道在WoW中如何完成低级库操作.
"魔兽世界"中的AFAIK也缺席package.了.:(
所以问题:对我来说,简化的方法是编写一个函数,它将require使用WoW中提供的接口来模拟函数.问题是如何.有人可以给我一些指示吗?
或者作为替代方案,为了将提到的现有源移植到WoW,我需要将require Some.Other.Modulelua源中的行替换为WoW将理解的内容.require Some.Module魔兽世界的等效/替代品是什么?
WoW如何处理低级别的模块/库?
您可以使用各种合并脚本之一将所有文件合并为一个,例如amalg。然后,您可以加载该文件和require使用常规的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>
Run Code Online (Sandbox Code Playgroud)
该文件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
Run Code Online (Sandbox Code Playgroud)
这应该模拟package库的足够内容,以使您require可以将模块加载到合并文件中。但是,不同的合并脚本可能需要的不同位package,因此您可能必须查看生成的Lua源代码。
并且在特定情况下,Coat您可能还需要为其他Lua函数实现存根。例如,我见过Coat使用debug库...
| 归档时间: |
|
| 查看次数: |
1695 次 |
| 最近记录: |