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

  • Post author:
  • Post category:其他


前几天在做一个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

可以看到,用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