gpt4 book ai didi

function - 在lua中调用函数时使用多个括号

转载 作者:行者123 更新时间:2023-12-05 09:09:19 25 4
gpt4 key购买 nike

我一直在学习 Lua 中的柯里化(Currying)并遇到了以下代码:

function addup(x)
local sum = 0
local function f(n)
if type(n) == "number" then
sum = sum + n
return f
else
return sum
end
end
return f(x)
end

print(addup (1) (2) (3) ()) --> 6
print(addup (4) (5) (6) ()) --> 15

我假设 (1) (2) (3) () 部分意味着值是连续而不是同时传递给函数的。我的问题是我无法完全弄清楚这些值是如何准确地传递的以及函数如何操作它们。所以第一个值转到 x,但是第二个会发生什么?它是否作为 n 传递给内部函数?那么第三个去哪儿了?

我的另一个问题是这条线:

return f

这里一个函数返回它自己,没有任何值,甚至没有括号。我知道您可以将字符串或表格传递给省略括号的函数,但这里不是这种情况。那么这是怎么回事?

我查看了手册,但没有找到关于这些功能的任何内容。我真的很感激解释或指向详细介绍此内容的手册的链接。谢谢。

更新:链接到我提到的教程 - http://lua-users.org/wiki/CurriedLua

正如其中一位回答者所指出的,lua 中没有 (x)(y) 语法。它是什么,是一系列的函数调用。这实际上并没有在教程中提到,但这是我的假设,结果证明是错误的,所以我编辑了这一点。

问题已解决。感谢您的所有回答,它们非常有帮助。

最佳答案

Lua 中没有(x)(y) 语法。这就是为什么您在手册中找不到任何内容的原因。 (x)(y) 本身会导致语法错误

addup (1) (2) (3) () 是一系列函数调用。要理解这一点,您必须仔细阅读 addup 的代码,并意识到函数调用只不过是一个函数值,后跟调用运算符,而函数只是您可以作为任何其他类型返回的值。

这个表达式是从左到右求值的。

调用运算符 () 对其左侧的值进行操作。因此,首先我们评估调用全局函数 addupaddup(1)

addup 定义了一个局部数值local sum = 0 和一个局部函数值f

local function f(n)
if type(n) == "number" then
sum = sum + n
return f
else
return sum
end
end

然后返回使用 addup 的参数 x

调用的函数的返回值
return f(x)

sumf 的上值,该值在定义 f 的范围内。所以每次调用 f 时,它都可以访问 sum

因此 n 在函数 f 中变成了 x。由于 n 是一个数字值 f 会将 n 添加到 sum 并返回一个本身 f.

因此 addup(1) 计算出对 f 的引用,一个上值 sum == 1 的函数值。

现在我们在 (2) 的左侧有这个返回的函数值,这是对 f 的另一个函数调用。这次 n2。同样,它是一个数字,因此它将被添加到 sum 并且 f 将再次返回。

现在 f(3) 调用。同上。

最后用 () 调用 f。这次 nnil 并且 f 返回 sum。所以 addup (1) (2) (3) () 在它被交给 print 之前最终计算为 6

不确定你从哪里得到这个例子,但对我来说没有太大意义。有更简单的方法来解释升值和闭包。像这样的代码不必要地难以阅读。

关于function - 在lua中调用函数时使用多个括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62519887/

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