Lua “什么是”呢;对象={…}";在卢阿好吗?

Lua “什么是”呢;对象={…}";在卢阿好吗?,lua,Lua,我最近在《魔兽世界》中读到了lua和插件。由于插件的接口语言是lua,我想学习一种新的语言,我认为这是一个好主意 但有一件事我不知道。在几乎每个插件的顶部都有一行,它看起来像是一个构造函数,它创建了一个对象,我可以访问该对象上的成员。这一行是这样的: object = {...} 我知道,如果一个函数返回多个值(这对lua来说是一个巨大的加号),而我不想将它们分别存储在多个值中,那么我可以直接编写 myArray = {SomeFunction()} 其中myArray现在是一个包含值的表,

我最近在《魔兽世界》中读到了lua和插件。由于插件的接口语言是lua,我想学习一种新的语言,我认为这是一个好主意

但有一件事我不知道。在几乎每个插件的顶部都有一行,它看起来像是一个构造函数,它创建了一个对象,我可以访问该对象上的成员。这一行是这样的:

object = {...}
我知道,如果一个函数返回多个值(这对lua来说是一个巨大的加号),而我不想将它们分别存储在多个值中,那么我可以直接编写

myArray = {SomeFunction()}
其中
myArray
现在是一个包含值的表,我可以通过索引它来访问值(
myArray[4]
)。由于元素不是显式类型化的,因为只有值本身才保持其类型,所以这对于lua来说很好。我还知道,“…”可以用于函数中的参数数组,以防函数在调用时不知道得到多少参数(如java中的
String[]args
)。但是这个“花括号-点,点,点-花括号”是用来做什么的呢

来自then{…}表示传递给程序的参数。在您的例子中,这些可能是从游戏传递到插件的参数


您可以在和中看到这方面的参考。

您已经在问题中说明了所有内容:

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

函数foo(a,b,…) 返回{…} 结束 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()
,该函数返回一个您可以调用的函数,并且您猜到了,可以将参数传递给它

想象一下以下情况:

函数foo(a,b) 印刷品(b) 印刷品(a) 结束 foo(‘你好’、‘世界’)
这几乎相当于

函数foo(…) 局部a,b=。。。 印刷品(b) 印刷品(a) 结束 foo(‘你好’、‘世界’) 100%(性能除外)相当于

--注意[[string]]只是多行“strings”的一种方便语法
foo=负载([[
局部a,b=。。。
印刷品(b)
印刷品(a)
]])
foo(‘你好’、‘世界’)

将以下文本放在文件开头:

local args = {...}
for __, arg in ipairs(args) do
    print(arg)
end
它揭示了:

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

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

在函数中,例如:
function x(…)object={…}end
,这基本上是操作类型,如
myArray={SomeFunction()}
,只有它将参数填充到一个表中,并将该表存储在
对象中
。我不知道三点语法在函数之外的含义。也许加载的插件是一种调用,因此具有某种形式的上下文参数?您可以在github()上查看“Questie”。在Questie.lua和modules/QuestieAuto.loa中,您有_Questie={…}和QuestieAuto_Questie={…}在WoW插件的情况下(请参见关于Questie插件的hiw注释),此构造在插件的顶层使用,在插件中声明的函数之外。然而,可能会有一些上下文从游戏传递到插件,这将适合于此。拉塞夫·戈斯·瑟卡尔森:我不确定那会是什么情况。我把我的答案扩大了一点,以便澄清