使用loadstring和LUA5.1在循环中定义函数

使用loadstring和LUA5.1在循环中定义函数,lua,Lua,我目前正在尝试使用连接、加载字符串和for循环的组合来定义一个函数 这就是我目前所做的事情: > for f=1,8 do loadstring("function f" .. f .. " () print('" .. f .. "') end") end > f1() stdin:1: attempt to call global 'f1' (a nil value) stack traceback: stdin:1: in main chunk [C]: ?

我目前正在尝试使用连接、加载字符串和for循环的组合来定义一个函数

这就是我目前所做的事情:

> for f=1,8 do
loadstring("function f" .. f .. " () print('" .. f .. "') end")
end
> f1()
stdin:1: attempt to call global 'f1' (a nil value)
stack traceback:
    stdin:1: in main chunk
    [C]: ?
该函数以“function f()print()end”的形式计算一组块。但是,正如您所看到的,它似乎没有正确地将函数保存到变量f1-f8中。

loadstring()函数返回一个函数,调用该函数时,该函数将执行作为参数给出的代码。它实际上并不调用函数或运行代码。请尝试以下操作:

for f=1,8 do
loadstring("function f" .. f .. " () print('" .. f .. "') end")()
end
添加的括号调用刚由loadstring()创建的函数,创建编号的函数。

loadstring()函数返回一个函数,该函数在调用时执行作为参数给出的代码。它实际上并不调用函数或运行代码。请尝试以下操作:

for f=1,8 do
loadstring("function f" .. f .. " () print('" .. f .. "') end")()
end

添加的括号调用loadstring()刚刚创建的函数,创建编号的函数。

同样的事情也可以通过

for f=1,8 do
   _G["f"..f]=function () print(f) end
end

同样的事情也可以通过

for f=1,8 do
   _G["f"..f]=function () print(f) end
end

您应该声明
loadstring
首先返回了一个有效的区块。这样,如果有什么东西坏了,你就可以得到编译器错误。@Nicol一般来说,是的,你应该这样做。然而,我的理解是,这段代码与其说是健壮应用程序的有用组件,不如说是一个学术练习。在文档中,它只是说“使用字符串加载块”,我只是解释为它运行字符串中的代码。我没有读它下面的部分,它说了如何运行代码。是的,这更像是一项学术活动。我想实际做的事情稍微复杂一点,但我可以自己解决这一部分。谢谢你的帮助!您应该声明
loadstring
首先返回了一个有效的区块。这样,如果有什么东西坏了,你就可以得到编译器错误。@Nicol一般来说,是的,你应该这样做。然而,我的理解是,这段代码与其说是健壮应用程序的有用组件,不如说是一个学术练习。在文档中,它只是说“使用字符串加载块”,我只是解释为它运行字符串中的代码。我没有读它下面的部分,它说了如何运行代码。是的,这更像是一项学术活动。我想实际做的事情稍微复杂一点,但我可以自己解决这一部分。谢谢你的帮助!Woah,是不是像一个包含所有全局变量的全局表?是的,
\u G
包含包含所有全局变量但根本不是特殊变量的表。Woah,是不是像一个包含所有全局变量的全局表?是的,
\u G
包含包含所有全局变量但根本不是特殊变量的表。