WOW插件, Lua, local _, T =的含义

最近我在研究名为VenturePlan的WOW插件,其用于计算您的指挥台任务的结果。

它是一个简单的插件,几乎所有文件都是'.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'首先被加载,但它没有返回任何有用的信息。

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

该插件可以在这里下载 https://www.townlong-yak.com/addons/venture-plan

点赞
用户6632736
用户6632736

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

对于这种执行Lua代码而言,不一定需要返回值。它可以通过改变接收到的参数来发送数据,因为表和全局变量是通过引用传递的。

2021-01-19 06:14:35
用户2858170
用户2858170

将 Lua Chunks 作为函数加载到文件中

Lua Chunks 在文件中被加载为一个函数。WoW 将提供两个参数调用这些函数。第一个参数是插件的名称,第二个参数是在插件的所有文件之间共享的表。

这样,您就不必使用全局环境来共享文件之间的数据。

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

在所有这些文件中使用 print(_, T) 应该会得到相同的字符串和表。

2021-01-19 14:48:44
用户7316806
用户7316806

Lua 结果栈(Stack)的简单用法示例

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

-- 调用 stack_results 函数,跳过第一个,获取第二个结果,然后再跳过两个,获取第五个结果
local _, a, _, _, b = stack_results()

-- 结果将为 2, 5
print("Result: ", a, b)
Result:     2   5
2022-03-30 09:14:57