我最近阅读了有关“魔兽世界”游戏的lua和附加组件的信息。由于插件的界面语言是lua,并且我想学习一种新语言,因此我认为这是个好主意。
但是这是我不知道的一件事。在几乎每个插件中,最上面的这一行对我来说就像一个构造函数,该构造函数创建一个对象,我可以访问该对象。这行代码是这样的:
object = {...}
我知道,如果一个函数返回多个值(恕我直言,这对lua来说是一个巨大的优势),并且我不想将它们分别存储在多个值中,我可以编写
myArray = {SomeFunction()}
其中myArray
现在是一个包含值的表,我可以通过对其进行索引(myArray[4]
)来访问这些值。由于没有元素被显式地键入,因为只有它们自己的值才拥有它们的类型,这对于lua来说是很好的。我也知道在函数不知道调用时会得到多少个参数的情况下(例如Java中的String[] args
),“ ...”可用于函数中的参数数组。但是,诸神的名字叫“弯括号-点,点,点-大括号”?
答案 0 :(得分:3)
您已经回答了所有问题:
{...}
实际上只是您所描述的两种行为的组合:它创建了一个包含所有参数的表,所以
function foo(a, b, ...)
return {...}
end
foo(1, 2, 3, 4, 5) --> {3, 4, 5}
基本上,...
只是一个正则表达式,就像返回多个值的函数调用一样。以下两个表达式的工作方式完全相同:
local a, b, c = ...
local d, e, f = some_function()
请记住,尽管这样做会影响性能,所以也许不要在每秒调用1000次的函数中使用它;)
编辑:
请注意,这确实不仅仅适用于“功能”。实际上,函数比其他任何东西更具有语法功能。在幕后,Lua只知道块,这是函数和.lua
文件都变成的。因此,如果您运行Lua脚本,则整个脚本会变成一个大块,因此与函数没有什么不同。
就代码而言,不同之处在于,使用函数可以在代码之外指定其参数的名称,而使用文件可以将代码指定为最外层。没有“外部”文件。
幸运的是,所有Lua文件作为大块加载时,它们都是自动可变的,这意味着它们将获得...
来访问其参数列表。
在script.lua中调用lua script.lua foo bar
之类的文件时,...
实际上将包含两个参数“ foo”和“ bar”,因此这也是使用时访问参数的一种便捷方法Lua用于独立脚本。
在您的示例中,它实际上非常相似。最有可能在脚本的其他地方加载了load()
,该脚本返回了您可以调用的函数,并且您猜到了该函数将参数传递给它。
想象一下以下情况:
function foo(a, b)
print(b)
print(a)
end
foo('hello', 'world')
这几乎等同于
function foo(...)
local a, b = ...
print(b)
print(a)
end
foo('hello', 'world')
相当于100%(也许在性能上除外)
-- Note that [[ string ]] is just a convenient syntax for multiline "strings"
foo = load([[
local a, b = ...
print(b)
print(a)
]])
foo('hello', 'world')
答案 1 :(得分:1)
从Lua 5.1 Reference manual开始,然后{...}表示传递给程序的参数。在您的情况下,这些可能是从游戏传递到插件的参数。
您可以在this question和this thread中看到对此的引用。
答案 2 :(得分:0)
在文件开头放置以下文本:
local args = {...}
for __, arg in ipairs(args) do
print(arg)
end
它表明:
因此,插入到args [2]的信息可用于其他文件。