下面这行代码,不太好看,但是很方便。(不鼓励这种调用方法)loadstring(s)()如果有语法错误,loadstring 会返回nil + 类似‘attempt to call a nil value’这样的err_msg。如果想获取更详细的err_msg,那就需要用assert :assert(loadstring(s))()下面这样的使用方式(对一个字面值string使用loadstring),没什么意思,f = loadstring("i = i + 1")粗略的等价于:但是,也不是完全相同,且继续往下看。第二种方式的代码运行起来更快,因为它只需要编译一次,而loadstring 每次都需要编译。下面我们来看看,上面两段代码到底有什么不同,如下示例:i = 32 local i = 0 f = loadstring("i = i + 1; print(i)") g = function () i = i + 1; print(i) end f() --> 33 g() --> 1g 函数处理的事局部变量i , 而f 函数处理的是全局变量i ,loadstring 总是在全局环境中进行编译。loadstring 最典型的用途是:运行外来代码,例如网络上的,别人的。。。注意,loadsting 只能load语句,不能load表达式, 如果你想算一个表达式的值,那么前面要加上一个return 来返回给定表达式的值。下面是一个示例帮助理解:print "enter your expression:" local l = io.read() local func = assert(loadstring("return " .. l)) print("the value of your expression is " .. func())看一下运行情况:(注意第一个为什么报错了,想想什么才叫表达式)loadstring 返回的就是一个普通的函数,可以多次调用:print "enter function to be plotted (with variable "x"):" local l = io.read() local f = assert(loadstring("return " .. l)) for i=1,20 do x = i -- global "x" (to be visible from the chunk) print(string.rep("*", f())) end(string.rep 函数复制一个string给定的次数),下面是运行结果:如果我们在深究一下,其实不管loadstring 也好,loadfile 也好,Lua中最基础的函数是load 。loadfile 从一个file中加载代码块,loadstring 从一个string中加载代码块,而load 调用一个reader函数来获取代码块,这个reader 函数分块返回代码块,load 调用它,直到它返回nil 。我们很少使用load 函数;通常只有在代码块不是位于一个file中,但是又太大了,不适合放到内存中(如果适合放到内存中,那就可以用loadstring 了)的时候,才会用load 。