gpt4 book ai didi

lua - 可变数量的函数参数 Lua 5.1

转载 作者:行者123 更新时间:2023-12-03 01:06:32 24 4
gpt4 key购买 nike

在我的 Lua 脚本中,我试图创建一个具有可变数量参数的函数。据我所知,它应该像下面那样工作,但不知何故,我在 TI-NSpire 上遇到了 Lua 5.1 错误(全局参数为零)。我究竟做错了什么?谢谢!

function equation:init(...)
self.equation = arg[1]
self.answers = {}
self.pipe = {arg[1]}
self.selected = 1

-- Loop arguments to add answers.
for i = 2, #arg do
table.insert(self.answers, arg[i])
end
end

instance = equation({"x^2+8=12", -4, 4})

最佳答案

Luis's answer是对的,如果比初学者​​可能希望的语言更简洁的话。我将尝试详细说明它,希望不会造成额外的困惑。

您的问题是在 TI 计算器的特定模型中嵌入 Lua 的上下文中。因此,会有一些与独立 Lua 不同的细节,但大部分细节都与您的环境中可用的库和函数有关。 Lua 的嵌入式版本与其作者分发的独立 Lua 显着不同,这是不寻常的(尽管 Lua 是开源的,可能)。 (Lua Binaries 是许多平台的二进制文件存储库。Lua for Windows 是 Windows 的包含电池的完整发行版。)

您的示例代码有一个混淆因素,即它需要与计算器框架提供的类系统交互的细节。该细节主要表现为您的 equation 之间没有联系。对象和 equation:init()被调用的函数。因为有技术可以把它粘起来,这只是一种分心。

据我了解,您的问题归结为关于如何在 Lua 中声明和实现可变参数函数(具有可变数量参数的函数)的混淆。从您对 Luis 回答的评论来看,您一直在阅读 Lua 编程(又名 PiL)的在线版本。你引用了 section 5.2 . PiL 是该语言背景的良好来源。不幸的是,可变参数函数是不断变化的特征之一。网上书的版本从Lua 5.0版开始是正确的,但是TI计算器可能运行的是Lua 5.1.4。

在 Lua 5 中,使用以符号 ... 结尾的参数列表声明了一个可变参数函数。代表其余的论点。在 Lua 5.0 中,调用是使用名为 arg 的“神奇”局部变量实现的。其中包含一个表,其中包含与 ... 匹配的参数.这要求每个可变参数函数在调用时都创建一个表,这是不必要的开销和垃圾收集器压力的来源。所以在 Lua 5.1 中,实现发生了变化:...可以直接在被调用函数中用作匹配参数的别名,但实际上没有创建表。相反,如果需要参数的数量,你可以写 select("#",...) ,如果需要第 n 个参数的值,您可以写 select(n,...) .

您示例中的一个混淆因素又回到了类(class)系统。您要声明函数 equation:init(...) .由于这个声明使用了冒号语法,它等价于写 equation.init(self,...) .因此,当最终通过类框架使用 __call 调用时元方法,真正的第一个参数被命名为 self并且零个或多个实际参数将匹配 ... .

正如下面 Amr 的评论所指出的,表达式 select(n,...)实际上返回从第 n 个参数开始的所有值,这在这种情况下对于构造 self.answers 特别有用。 ,但也会导致 self.pipe 的初始化可能存在错误.

这是我对您在 equation:init() 的定义中尝试实现的修正近似值,但请注意,我手头没有 TI 计算器之一,这是未经测试的:

function equation:init(...)
self.equation = select(1, ...)
self.pipe = { (select(1,...)) }
self.selected = 1
self.answers = { select(2,...) }
end

在上面显示的修订版中,我写了 {(select(1,...))}创建一个包含第一个参数的元素的表,以及 {select(2,...)}创建一个包含所有剩余参数的表。虽然可以以这种方式插入表中的值数量有限制,但该限制与函数的返回值数量或可以传递给函数的参数数量有关,因此不能超出对 ... 的引用.请注意,一般情况下可能并非如此,请写下 { unpack(t) }可能导致不复制 t 的所有数组部分.

编写函数的一种效率稍低的方法是对传递的参数编写一个循环,这是我原始答案中的版本。如下所示:
function equation:init(...)
self.equation = select(1, ...)
self.pipe = {(select(1,...))}
self.selected = 1

-- Loop arguments to add answers.
local t = {}
for i = 2, select("#",...) do
t[#t+1] = select(i,...)
end
self.answers = t
end

关于lua - 可变数量的函数参数 Lua 5.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7573588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com