WOW插件,Lua,T在本地的含义_,T=

WOW addons, Lua, the meaning of T in local _, T =

最近,我正在尝试浏览一个名为 VenturePlan 的 WOW 插件,它会计算您的命令 table 任务的结果。

这是一个简单的插件,几乎包含纯“.lua”文件。它们是 'Collector.lua'、'Loader.lua'、'MissionList.lua'、'MissionView.lua'、'VenturePlan.toc'、'vs-spells.lua'、'vs.lua'、'Widgets.lua'、 'Libs/Evie.lua'.

我对编程有一点了解,比如python和c。但我还没有为 WOW 编写插件。我卡在了这个插件的开头。

几乎每个文件都有一段代码

local _, T = ...
local EV = T.Evie

据我了解,最开始的那些代码,通常是一些变量声明,或者模块导入。在这里,作者似乎向 'T' 传递了一些值,但我不知道这是在哪里发生的,它甚至不是一个可调用函数,它在一个 .lua 文件中。

另外,我找不到入口点。似乎 'Loader.lua' 将首先加载,但它永远不会 return 任何有趣的东西。

那么,'T' 是从哪里来的呢?它的结构是什么,定义在哪里?

插件在这里https://www.townlong-yak.com/addons/venture-plan

WoW 似乎会用 C lua_load/luaL_dostring/luaL_dofile 或 Lua loadstring 打开那些 *.lua 文件/loadfile;他们将 Lua 代码转换为函数。 ... 是可变参数函数的参数列表;多重赋值 local _, T = ... 意味着 _ 是传递给函数的第一个参数,而 T 是第二个。

Return 对于这种执行 Lua 代码并不是真正必要的。它可以通过更改接收到的参数来发回数据,因为表是通过引用传递的;以及全局变量。

Lua 文件中的块作为函数加载。 WoW 将调用那些提供两个参数的函数。第一个参数是插件的名称,第二个参数是插件的所有文件共享的 table。 这样您就不必使用全局环境在文件之间共享数据。

local _, T = ... 会将这两个参数存储在两个局部变量中。 _ 通常用于命名未使用的变量。例如,luacheck 不会对名为 _

的未使用变量发出警告

print(_, T) 在所有这些文件中,你应该得到相同的字符串和 table.

lua结果栈的简单使用示例。

function stack_results()
    return 1, 2, 3, 4, 5, 6, 7, 8, 9 
end

-- skip 1st, then get 2nd result, then skip 2 results and get 5th result
-- calling stack_results function
local _, a, _, _, b = stack_results()

-- result will be 2, 5
print("Result: ", a, b)
Result:     2   5