函数列表

下面的定义已经在表中打印了函数的结果:

function plus1(zahl) print(zahl+1) end
function plus2(zahl) print(zahl+2) end
function plus3(zahl) print(zahl+3) end

-- 已经打印出6, 5, 10
local tfunc={plus1(5),plus2(3),plus3(7)}
  1. 我该如何避免这种情况?

  2. 我该如何在表中给定参数的情况下迭代函数?我想像这样调用函数:

    tfunc[1]

    以打印出6。但这样行不通。

@pschulz,感谢您的指导:

 local tfunc = {{plus1,5},{plus2,3},{plus3,7}}
 tfunc[i][1](tfunc[i][2])

允许使用索引i迭代具有不同参数的不同函数。技巧是在表中使用函数名称和参数。

点赞
用户2858170
用户2858170
本地变量 `tfunc` 包含了三个函数的调用结果,它们分别为调用 `plus1` 函数并传入 `5`、调用 `plus2` 函数并传入 `3` 和调用 `plus3` 函数并传入 `7` 的结果。

在这里,你在表构造函数内调用了这些函数。一旦你创建了这个表,你就可以打印这些值。由于你的函数没有返回值,因此 `tfunc` 保持为空。你可以将函数调用保存为字符串,并让 Lua 执行该字符串,或者将函数保存在表中而不调用它。然后你需要一些方法将函数参数 `zahl` 带入到函数调用中。

对我来说,你想做的事情没有意义。如果你想像 `tfunc[1]` 这样调用它,它将始终打印出 6。那么为什么不直接调用 `print(6)` 呢?

如果你想给要打印的数字加上 3,只需调用 `print(number + 3)`,例如。如果你不将简单的算术运算移到额外的函数中,你的代码会更容易理解和阅读。
2016-06-03 12:49:16
用户3197530
用户3197530

在你的表中,你目前并没有存放任何东西(或者说是三个nil)。该表获取函数的返回值,而由于你没有返回任何值,所以它获取到了nil。

你所需要做的是存储函数

local tfunc = {
    plus1,
    plus2,
    plus3
}

然后你可以像这样调用你的函数:

tfunc[1](5)

关于迭代:如果我的理解正确,你想要做的是以下事情:

local tfunc = {
    plus1,
    plus2,
    plus3
}
local tvalues = { 5, 3, 7 }
for i, func in ipairs(tfunc) do
    func(tvalues[i])
end

因此你需要将你的值保存在另一个表中。有更优雅的方法来实现这一点,建议你阅读有关closures的内容。

2016-06-03 12:49:33