Lua称为解释型语言的原因:Lua允许在运行源代码之前,先将源代码预编译为一种中间形式。区别解释型语言的主要特征是在于编译器是否是语言运行时库的一部分,即有能力执行动态生成的代码。因为Lua中有dofile函数,才可以将Lua成为一种解释型的语言。

 
     运行Lua代码块有三种形式:
     1、dofile 直接编译运行Lua外部代码块,并不返回任何结果。
     2、loadfile 编译Lua外部代码块,但不会运行代码,将会以函数的形式返回编译结果。
     3、loadstring 编译字符串中的代码,而非从文件读取。
 
     如何区别 dofile与loadfile?
     1、dofile 编译并运行代码块,而loadfile 只编译不运行。
     2、dofile 不返回任何结果,loadfile 返回编译结果函数。
     3、dofile 是 loadfile的封装,loadfile是dofile的核心。
     4、dofile 如果编译失败将会引发一个错误,loadfile不会引发错误而会返回nil及错误信息。
     
     dofile是loadfile的封装是因为dofile的编译工作是loadfile做的,而dofile增加了扑捉编译错误及运行返回结果的操作。在下面loadfile如果失败,那么函数assert将会引发一个错误。
 
 
文件Module.lua
 
 
编译helloworld.lua,在文件中编译运行Module.lua文件并调用Module的函数。这里只能调用和Module文件中的全局变量与函数。
 
 
 
 
     dofile与loadfile的优劣:对于简单任务dofile非常的便捷,在一次调用中完成整个编译与运行,而loadfile更加的灵活,在发生错误的情况下loadfile会返回nil以及错误信息,这可以按自定义的方式去处理错误。当需要多次运行一个文件时,只需要调用一次loadfile并保存编译结果函数,然后多次调用编译结果函数即可,优点是只编译一次可多次运用。而dofile每次运行都需要从新编译,相较dofile而言loadfile的开销将小很多。
 
     loadstring与loadfile类似,不同之处在于loadstring从字符串中读取代码块,而loadfile是从文件读取。(Lua 5.3中已经没有loadstring了,使用load代替了)
 
 
使用loadstring每次都要先进行定义函数,然后再执行函数,那么像dofile一样快捷简单的执行string代码是这样定义的:(lua5.1中没有dostring,那就手动实现一下吧)
 
 
     当然,因为Lua中loadstring在编译时不涉及词法域,所以loadstring在编译时不会显示错误信息,当使用assert时就可以清楚的显示loadstring中的错误:
 
 
     loadstring 因编译时不涉及词法域 因此与function定义的函数不等价,loadstring总是在全局环境中编译它的字符串:
 
 
     当然loadstring可以在字符串内部声明局部变量,以避免混淆全局环境。Lua中将所有独立的程序块视为一个匿名函数的函数体,并且匿名函数还具有可变长实参,因此loadstring还具有变长参数的能力:
 
 
     loadstring的功能非常的强大,但应该谨慎使用。这是因为相对于其他功能而言,它也是一个开销比较大的函数,并且会导致比较难以理解的代码。在决定使用它之前,请先确定是否找不到更简单合适的方法时再使用它解决。loadstring最典型的应用就是执行外部代码,也就是程序之外的代码。若对loadfile及loadstring进一步研究,就会发现其实有一个真正的原始函数load。loadfile和loadstring分别从文件和字符串中读取程序块,load则接收一个“读取器函数”,并在内部调用它来获取程序块及错误信息。读取器函数可以分几次返回一个程序块,load会反复调用它,直到它返回nil为止。一般很少用load,只有当程序块不在文件中,或者程序块过大而无法放入内存中时,才会使用。(在Lua5.3中没有了loadstring函数,使用load代替了它)下载Lua5.3的源码中lbaselib.c文件中基本函数如下:
 
 
 

Lua 学习笔记(七)编译、执行外部代码块的更多相关文章

  1. Android(java)学习笔记188:关于构造代码块,构造函数的一道面试题(华为面试题)

    1.源码是: package text; public class TestStaticCon { public static int a = 0; static { a = 10; System.o ...

  2. Android(java)学习笔记131:关于构造代码块,构造函数的一道面试题(华为面试题)

    1. 代码实例: package text; public class TestStaticCon { public static int a = 0; static { a = 10; System ...

  3. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  4. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  5. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Java IO学习笔记七:多路复用从单线程到多线程

    作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...

  7. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  8. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  9. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

随机推荐

  1. tcpdump

    tcpdump tcp -i eth1 -t -s -c and dst port ! and src net -w ./target.cap (1)tcp: ip icmp arp rarp 和 t ...

  2. 配置python环境变量(转)

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1.首先需要在系统中注册python环境变量:假设python的安装路 ...

  3. webform 光棒效果,删除操作弹出确定取消窗口

    鼠标移入onmouseover和鼠标移出onmouseout,代码里没大写我这也就不大写了.那首先,我们得获取Class为tr_item里的所有东西,也就是项标签里的数据.然后呢,我们定义一个oldC ...

  4. cordova插件开发注意事项

    1. 编写插件,先创建好cordova项目之后,在项目里开发调试好在去创建插件目录 如何在cordova项目里创建呢,在android文件夹下面的res/xml/config.xml里去加入插件 例如 ...

  5. Mimikatz 使用Tips

    1.记录 Mimikatz输出: C:\>mimikatz.exe ""privilege::debug"" ""log sekurl ...

  6. RecylerView完美实现瀑布流效果

    RecylerView包含三种布局管理器,分别是LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager,对应实现单行列表,多行 ...

  7. ios获取左右眼图片景深图

    cv::Mat leftMat,rightMat,depthMapMat; UIImageToMat(leftImage, leftMat); UIImageToMat(rightImage, rig ...

  8. 学习笔记:delphi多线程知识

    最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处. Delphi的线程同步方法: ...

  9. Python黑帽编程1.2 基于VS Code构建Python开发环境

    Python黑帽编程1.2  基于VS Code构建Python开发环境 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Atta ...

  10. 剑指Offer面试题:10.数值的整数次方

    一.题目:数值的整数次方 题目:实现函数double Power(doublebase, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 在.N ...