前几天在做一个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这个函数呢?下面是简单的例子。

代码

 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

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

  1. c语言中 调用函数除函数名外,【单选题】在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值...

    [单选题]在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值 更多相关问题 下列关于IMOECDIS性能标 ...

  2. python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值

    python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值 一 .函数概念 函数是根据需要,将代码打包为代码块, 每一个代码块就可以封装为一个函数 ...

  3. 习题 8.6 写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

    C程序设计(第四版) 谭浩强 习题8.6 个人设计 习题 8.6 写一函数,求一个字符串的长度.在main函数中输入字符串,并输出其长度. 代码块: 方法1: #include <stdio.h ...

  4. 写一个函数,求一个字符串的长度,在main 函数中输入字符串,并输出其长度。

    // 写一个函数,求一个字符串的长度,在main 函数中输入字符串,并输出其长度. #include <stdio.h> main() {  int len;  char*str[20]; ...

  5. 写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度

    写一个函数,求一个字符串的长度.在main函数中输入字符串,并输出其长度 代码如下: #include<stdio.h> int len(char *p); int main() {int ...

  6. 题8.6:写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

    题目 本题是谭浩强<C程序设计课后习题>题8.6. 题目: 写一函数,求一个字符串的长度.在main函数中输入字符串,并输出其长度. 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨, ...

  7. 浅谈python函数

    python 函数 形式: def函数名(形参·*****·······) 函数体 注意事项: 1.函数的返回值不需要在函数名前进行制定类型,python是一个动态返回,会返回return后的数据类型 ...

  8. 浅谈云函数的代理IP利用面

    浅谈云函数的代理IP利用面 前言 本篇文章介绍如何通过 Serverless(云函数) 实现各种扫描器探测功能,以达到绕过态势感知.WAF等安全设备,增大蓝队研判人员溯源难度,实现封无可封,查无可查的 ...

  9. 浅谈async函数await用法

    async和await相信大家应该不陌生,让异步处理变得更友好. 其实这玩意儿就是个Generator的语法糖,想深入学习得去看看Generator,不然你可能只停留在会用的阶段. 用法很简单,看代码 ...

  10. 浅谈js函数三种定义方式 四种调用方式 调用顺序

    在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...

最新文章

  1. backgroundworker控件的使用(线程传值)
  2. Nginx-06:Nginx配置实例之负载均衡
  3. 18个常用的JavaScript片段分享
  4. 机器学习里面的树形模型
  5. [JavaWeb-Servlet]Servlet中的生命周期方法(init,service,destroy)
  6. Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能 (转)
  7. 从无到有开发连麦直播技术点整理
  8. 简要安装FreeBSD 6.2及配置桌面环境[zz]
  9. MySQL 管理猿利器: MySQL ODBC for iPhone!
  10. 《恋上数据结构第1季》红黑树(未完)
  11. 编程语言 Ruby 如何还能再活 25 年?
  12. java生成sm4算法的对称密钥_技术分享丨这是一篇简单的小科普——什么是对称加密算法?(下)...
  13. 如何开发 Web 应用程序
  14. 房地产中介ERP管理系统设计方案(附源码)
  15. 深度学习降噪方案-RNNoise简介和环境配置
  16. 离奇而迷人的量子物理学:人类也是一种波
  17. c语言 最小公倍数与最大公因数
  18. 360剑灵洪门崛起服务器维护,剑灵洪门崛起公益服,年度bt无限元宝满v平台,快速升级及上手攻略...
  19. 记录一下融云即时通讯IM
  20. 人工智能如何定义下一代芯片?

热门文章

  1. keras分类器模型
  2. 极客大学架构师训练营 秒杀 搜索引擎 爬虫 Lucene Elastic Search 第18课 听课总结
  3. 算法:First Missing Positive(求缺失的第一个正整数)
  4. 常用screen参数
  5. 241.为运算表达式设计优先级
  6. InvalidArchiveError(‘Error with archive D:\\Program Files\\Anaconda\\pkgs\\numpy-base-1.19.1-py36ha3
  7. 电脑已安装软件提取安装包_SPSS 24,软件安装包及安装教程
  8. python中如何导入图片_python如何导入图片
  9. 计算机操作系统详细学习笔记(二):处理器管理
  10. 基础集合论 第二章 9 族