Lua模拟require函数

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如何处理低级别的模块/库?

sif*_*joe 5

您可以使用各种合并脚本之一将所有文件合并为一个,例如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库...