前几天在做一个Lua小程序的时候的要实现如下功能:通过解析一个字符串,如"</F>func",其中"</F>"是标识符,表示后面是个函数名。然后调用func这个函数,实现相应功能。后来翻了一下资料,其中一种方法就是可以用loadstring实现,Lua的教程中对loadstring的描述:从字符串中读取代码,如果代码中有语法错误会返回nil。可以看下面的例子:
1
--
第一种
2 i = 1
3 loadstring ( " i = i + 1 " )()
4 print (i) -- 2
5
6 -- 第二种
7 i = 1
8 f = loadstring ( " i = i + 1 " )
9 f()
10 print (i) -- 2
2 i = 1
3 loadstring ( " i = i + 1 " )()
4 print (i) -- 2
5
6 -- 第二种
7 i = 1
8 f = loadstring ( " i = i + 1 " )
9 f()
10 print (i) -- 2
可以看到,用loadstring执行一个字符串时,相当于一个声明一个匿名函数,当把它赋值给一个变量之后,调用方法和普通函数相同。但有一点需要注意,由于loadstring在编译时不涉及词法域,所以loadstring总是在全局环境中编译他的字符串,上面的代码中如果变量i前面加个local限制,则会报错:
[ERROR]: attempt to perform arithmetic on global `i' (a nil value) 。
回到前面的问题,当已知一个字符串 str = "func" 时, 怎么调用到func这个函数呢?下面是简单的例子。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
local
strFun
=
"
func
"
2 local nInt = 5
3 local sName = " \ " attacker\ "" -- 不能为"attacker",否则在loadstring会认为是全部变量attacker
4
5 function func(nParam1,sParam2)
6 print (nParam1)
7 print (sParam2)
8 end
9
10 local foo = loadstring (strFun .. " ( " .. nInt .. " , " .. sName .. " ) " )
11 foo()
12
13 -- 运行结果
14 5
15 attacker
2 local nInt = 5
3 local sName = " \ " attacker\ "" -- 不能为"attacker",否则在loadstring会认为是全部变量attacker
4
5 function func(nParam1,sParam2)
6 print (nParam1)
7 print (sParam2)
8 end
9
10 local foo = loadstring (strFun .. " ( " .. nInt .. " , " .. sName .. " ) " )
11 foo()
12
13 -- 运行结果
14 5
15 attacker
注意:上面代码中传入的是nInt和sName的具体值,在编译前已经确定,和第一个例子中的i不同。