通过和函数名相同的字符串调用函数 --浅谈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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值