lua中的” object = {…}”有什么用处?


What is “object = {…}” in lua good for?

我最近阅读了有关"魔兽世界"游戏的lua和附加组件的信息。由于插件的界面语言是lua,并且我想学习一种新语言,因此我认为这是一个好主意。

但是这是我不知道的一件事。在几乎每个插件中,最上面的这一行对我来说就像一个构造函数,该构造函数创建一个对象,我可以访问该对象。这行代码是这样的:

1
object = {...}

我知道,如果一个函数返回多个值(恕我直言,这对lua来说是一个巨大的优势),并且我不想将它们分别存储在多个值中,那么我可以编写

1
myArray = {SomeFunction()}

其中,myArray现在是一个包含值的表,我可以通过对其进行索引(myArray[4])来访问这些值。由于没有元素被显式键入,因为只有它们自己的值才拥有它们的类型,这对于lua来说是很好的。我也知道在函数不知道调用时会得到多少个参数的情况下," ..."可用于函数中的参数数组(例如java中的String[] args)。但是,诸神的名字叫"弯括号-点,点,点-大括号",用于???


您已经回答了所有问题:

{...}实际上只是您所描述的两种行为的组合:它创建一个包含所有参数的表,因此

1
2
3
4
5
function foo(a, b, ...)
   return {...}
end

foo(1, 2, 3, 4, 5) --> {3, 4, 5}

基本上,...只是一个正则表达式,就像返回多个值的函数调用一样。以下两个表达式以完全相同的方式工作:

1
2
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(),该脚本返回一个可以调用的函数,并且您猜到了该函数将参数传递给。

想象一下以下情况:

1
2
3
4
5
6
function foo(a, b)
   print(b)
   print(a)
end

foo('hello', 'world')

这几乎等同于

1
2
3
4
5
6
7
function foo(...)
   local a, b = ...
   print(b)
   print(a)
end

foo('hello', 'world')

相等的是100%(可能在性能上除外)

1
2
3
4
5
6
7
8
-- Note that [[ string ]] is just a convenient syntax for multiline"strings"
foo = load([[
   local a, b = ...
   print(b)
   print(a)
]])

foo('hello', 'world')


在Lua 5.1参考手册中,{...}表示传递给程序的参数。在您的情况下,这些可能是从游戏传递到插件的参数。

您可以在此问题和此线程中看到对此的引用。


在文件的开头放置以下文本:

1
2
3
4
local args = {...}
for __, arg in ipairs(args) do
    print(arg)
end

它揭示了:

  • args [1]是插件的名称
  • args [2]是一个(空)表,通过引用传递给同一插件中的所有文件

插入到args [2]的信息因此可用于其他文件。