在对字符串中的函数进行求值后,将参数传递给lua函数

最后发布: 2019-08-10 17:11:50


问题

我有函数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的输出。 因此,这里所涉及的基本困难是关于evaluating从变量字符串n ,然后把它作为参数传递给函数process 这里的loadstring函数没有用,因为matrix是local函数,不能从loadstring 这有什么工作吗? 我希望我在这里明确说明了这个问题。 它是关于评估(或卸载)字符串然后将其作为参数传递给另一个函数。 任何帮助将不胜感激。 谢谢。

string function lua arguments lua-table
回答

因为matrix是局部函数

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

现在,使用Lua 5.2+,您可以为load提供第二个参数,该表表示将构建Lua块的全局环境。 如果该表包含matrix值,则加载的字符串可以访问它。 对于Lua 5.1,您必须在返回的函数上使用setfenvload以实现类似的效果。 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())

请注意以下事项:

  • 您必须创建一个显式表,这是一个全局环境。 没有什么可以通过的说“让我的当地人可用”; 你必须把你想去的每个地方都放在那里。 一般来说,这就是为什么将这些东西作为参数传递或者只是将它们作为全局变量。

  • 如果要获取对matrix的调用结果,则明确需要"return "

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