gpt4 book ai didi

lambda - 返回 vargas lambdas lua 的 varargs 函数

转载 作者:行者123 更新时间:2023-12-02 06:37:42 25 4
gpt4 key购买 nike

如果我想编写一个采用 varargs 的函数并返回一个采用 vargas 的函数,我会遇到不明确的 ... 例如

    function bind(func, ...) return function(...)  func(..., ...) end end

最佳答案

首先,您缺少关闭绑定(bind)函数的结尾。

如果您有歧义,只需使用不同的名称来解决它们。

function bind(func, ...)
return function(...) func(..., ...) end
end

如果我们这样测试您的代码:bind(print, "a", "b", "c")(1,2,3)

你会得到输出:

1 1 2 3

如果函数参数列表中有...或任何其他名称,则该变量将是该函数范围内的局部变量。它将优先于上级作用域中具有相同名称的任何其他变量。所以你的匿名函数中的...与函数bind的...无关。

要解决此问题,您只需执行类似的操作

function bind(func, ...)
local a = table.pack(...)
return function(...) func(table.unpack(a, 1, a.n), ...) end
end

现在调用bind(print, "a", "b", "c")(1,2,3)将输出:

a 1 2 3

要了解 b 和 c 发生了什么,请阅读本节:https://www.lua.org/manual/5.3/manual.html#3.4.11

(当然还有 Lua 手册的其余部分)

When a function is called, the list of arguments is adjusted to the length of the list of parameters, unless the function is a vararg function, which is indicated by three dots ('...') at the end of its parameter list. A vararg function does not adjust its argument list; instead, it collects all extra arguments and supplies them to the function through a vararg expression, which is also written as three dots. The value of this expression is a list of all actual extra arguments, similar to a function with multiple results. If a vararg expression is used inside another expression or in the middle of a list of expressions, then its return list is adjusted to one element. If the expression is used as the last element of a list of expressions, then no adjustment is made (unless that last expression is enclosed in parentheses).

所以像 func(..., ...) 这样的东西永远不会工作,即使 ... 是两个不同的列表。

为了避免这种情况,您必须连接两个参数列表。

 function bind(func, ...)
local args1 = table.pack(...)
return function(...)
local args2 = table.pack(...)

for i = 1, args2.n do
args1[args1.n+i] = args2[i]
end
args1.n = args1.n + args2.n

func(table.unpack(args1, 1, args1.n))
end
end

绑定(bind)(打印,“a”,nil,“c”)(1,nil,3)

最终为我们提供了所需的输出:

a nil c 1 nil 3

但我相信您可以想出一种更好的方法来实现您的目标,而无需连接各种可变参数。

关于lambda - 返回 vargas lambdas lua 的 varargs 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43512118/

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