lua中的"object = {...}" 有何作用?

我最近了解了lua和针对游戏"魔兽世界"的插件。由于插件的接口语言是lua,我想学一门新语言,所以我认为这是个好主意。

但是有一件事情我搞不清楚。在几乎所有插件的顶部,有一行看起来像是一个构造函数,它会创建一个对象,通过它可以访问成员。这行代码大致如下:

object = {...}

我知道,如果一个函数返回多个值(这对于lua来说是一大优势)而且我不想分别将它们存储在多个值中,我可以写成

myArray = {SomeFunction()}

其中,myArray是包含这些值的表格,我可以通过索引访问这些值(myArray[4])。由于元素没有显示地指定类型,只有值本身才保留了它们的类型,因此对于lua来说这也是可以的。我也知道"..."可以用于函数的参数数组,当函数在调用时不知道有多少参数时(就像Java中的String[] args)。但是这个"花括号 - 点点点 - 花括号"到底是用来干什么的?

点赞
用户9110855
用户9110855

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

你可以在这个问题这个帖子中看到相关参考。

2019-09-20 07:15:46
用户4984564
用户4984564

在你的问题中已经说得很清楚了:

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

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文件当它们作为块加载时,都会自动变化,这意味着它们可以获得...以访问参数列表。

当您调用像lua script.lua foo bar这样的文件时,在script.lua内部,...实际上将包含两个参数“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')

这完全等价于(除了可能在性能方面)

-- 请注意,[[字符串]]只是多行“字符串”的方便语法
foo = load([[
   local a, b = ...
   print(b)
   print(a)
]])

foo('hello', 'world')
2019-09-20 08:54:00
用户4889587
用户4889587

在文件开头加入以下文本:

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

这里解释一下:

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

因此,插入到 args[2] 中的信息可以在不同的文件中使用。

2019-10-10 00:32:37