通过和函数名相同的字符串调用函数 --浅谈loadstring函数

  前几天在做一个Lua小程序的时候的要实现如下功能:通过解析一个字符串,如"</F>func",其中"</F>"是标识符,表示后面是个函数名。然后调用func这个函数,实现相应功能。后来翻了一下资料,其中一种方法就是可以用loadstring实现,Lua的教程中对loadstring的描述:从字符串中读取代码,如果代码中有语法错误会返回nil。可以看下面的例子:

 1 --第一种
 2 = 1
 3 loadstring("i = i + 1")()
 4 print(i)  -- 2
 5 
 6 --第二种
 7 = 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这个函数呢?下面是简单的例子。

 

 

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

 

注意:上面代码中传入的是nInt和sName的具体值,在编译前已经确定,和第一个例子中的i不同。

 

 

转载于:https://www.cnblogs.com/chuwp/archive/2010/01/24/1655065.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值