【问题标题】:What does the code "local a = (...);" in a required script mean?代码“local a = (...);”是什么意思in a required script 是什么意思?
【发布时间】:2015-01-03 19:29:04
【问题描述】:

在 Lua 文件中,我得到以下代码:

local mod_name = (...);

我尝试了代码print(mod_name),得到了文件名"pb"。 整个脚本由require('pb'); 从另一个脚本调用。 我知道(...) 在函数中用于多个参数的含义,但我对此感到困惑。

【问题讨论】:

  • 什么是“module(...);”什么意思?
  • Lua 中的 BTW 分号是可选的。 (在它们分隔标识符和关键字的地方,它们可以用空格代替。)

标签: module lua require


【解决方案1】:

... 表示参数列表,可以是块(例如脚本)或声明为function (named_arg_1, named_arg_2, ...)function (...) 的函数。

列表可以连接到列表,如{1, 2, ...}print("args:",...)。在这些示例中,它用于列表的上下文中。否则,它仅扩展到第一个值。

local a = (...) 中,由于括号构成表达式,上下文不是列表。因此,它为a 分配了第一个值。

括号似乎是风格的,因为尽管local a = ... 有一个列表上下文,a 仍然被分配了第一个值。其他示例:local a, b = ... 会将第二个值分配给 blocal a, b = (...) 会将 nil 分配给 b


由此可知,module(...) 将模块持有的值作为函数调用,其参数列表从... 列表扩展而来。

【讨论】:

  • 谢谢!脚本是从“require('test');”调用的,没有参数了,“...”怎么能不为nil呢?
  • 因为require 将其参数传递给加载的块。见here。另请注意,后来的 Lua 版本添加了额外的参数,因此最好像这样调用 module 函数:module( (...) ),这样额外的参数就不会意外传递给 module
  • 谢谢!!我已经测试过了,就在我发现我的测试代码中有一些错误之前。谢谢你的帮助!!
【解决方案2】:

在脚本的主体中,... 生成脚本的参数。它与arg 表的功能相同,参见Lua Standalone 参考手册。

for _, v in ipairs{...} do
    print(v)
end

例如,如果使用test.lua arg1 arg2 调用它,则会输出:

arg1
arg2

请注意,在您的local mod_name = (...) 中,由于括号,仅保留了第一个元素。


在您的示例中,该脚本是使用 require('pb') 从另一个脚本调用的。在这种情况下,它加载了两个参数,第一个是模块名称'pb',第二个取决于require 是如何获取加载器的。详情请阅读require的手册。

【讨论】: