在字符串中的 evaluating 函数之后将参数传递给 lua 函数

Passing argument to lua function after evaluating function in string

我有函数 processmatrix。以下代码有效

process(matrix({{2,4,6},{8,10,12},{14,16,20}}))

但是下面的方法不起作用。

n='matrix({{2,4,6},{8,10,12},{14,16,20}})'
process(n)

它抛出一些错误。原因很明显,进程将 n 作为 string 而不是函数的输出 matrix。所以这里涉及的基本难点是关于变量n中的evaluating字符串,然后将其作为参数传递给函数process。这里 loadstring 函数没有用,因为 matrix 是本地函数,不能从 loadstring 引用。 有什么解决方法吗?我希望我已经在这里清楚地说明了问题。它是关于评估(或卸载)字符串,然后将其作为参数传递给另一个函数。任何帮助将不胜感激。谢谢。

as matrix is local function

Lua 认真对待 local 声明 。如果一个变量被声明为 local,它只能被该变量局部范围内静态的代码访问。您稍后转换为代码的字符串不是静态地在本地范围内,因此无法访问 local 变量。

现在,使用 Lua 5.2+,您可以为 load 提供第二个参数,一个 table 代表 Lua 块将针对的全局环境被建造。如果 table 包含 matrix 值,则加载的字符串可以访问它。对于 Lua 5.1,您必须在返回到 load 的函数上使用 setfenv 才能实现类似的效果。 Lua 5.2+ 方法如下所示:

local env = {matrix = matrix}
local func = load("return matrix({{2,4,6},{8,10,12},{14,16,20}})", nil, "t", env)
process(func())

注意以下几点:

  • 您必须创建一个明确的 table 全局环境。没有什么可以传递 "make my locals available";你必须把你想访问的每个地方都放在那里。一般来说,这就是为什么你将这些东西作为参数传递或者只是将它们设为全局变量。

  • 如果您想获得调用 matrix 的结果,您明确需要 "return "

  • 您必须调用该函数。函数是 Lua 中的值,因此您可以自由传递它们。但是如果要将一个函数的results传递给另一个函数,就得实际调用了