lua中的"object = {...}" 有何作用?
我最近了解了lua和针对游戏"魔兽世界"的插件。由于插件的接口语言是lua,我想学一门新语言,所以我认为这是个好主意。
但是有一件事情我搞不清楚。在几乎所有插件的顶部,有一行看起来像是一个构造函数,它会创建一个对象,通过它可以访问成员。这行代码大致如下:
object = {...}
我知道,如果一个函数返回多个值(这对于lua来说是一大优势)而且我不想分别将它们存储在多个值中,我可以写成
myArray = {SomeFunction()}
其中,myArray是包含这些值的表格,我可以通过索引访问这些值(myArray[4])。由于元素没有显示地指定类型,只有值本身才保留了它们的类型,因此对于lua来说这也是可以的。我也知道"..."可以用于函数的参数数组,当函数在调用时不知道有多少参数时(就像Java中的String[] args)。但是这个"花括号 - 点点点 - 花括号"到底是用来干什么的?
在你的问题中已经说得很清楚了:
{...}实际上仅是你描述的两种行为的组合:它创建一个包含所有参数的表,因此
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')
在文件开头加入以下文本:
local args = {...}
for __, arg in ipairs(args) do
print(arg)
end
这里解释一下:
- args[1] 是插件的名称
- args[2] 是一个(空的)通过引用传递给同一插件中所有文件的表格
因此,插入到 args[2] 中的信息可以在不同的文件中使用。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

从Lua 5.1参考手册中可以得知,{...}表示传递给程序的参数。在你的情况下,这些可能是从游戏传递给插件的参数。
你可以在这个问题和这个帖子中看到相关参考。