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