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. Codeforces Round #361 (Div. 2) B

    B - Mike and Shortcuts Description Recently, Mike was very busy with studying for exams and contests ...

  2. 关于call和apply函数的区别及用法

    call和apply函数是function函数的基本属性,都可以用于更改函数对象和传递参数,是前端工程师常用的函数.具体使用方法请参考以下案列: 例如: 申明函数: var fn = function ...

  3. TreeSet

    一.TreeSet中的元素比较有两种方式 1.定义一个类,实现Comparable接口  复写的是comparato方法 2.定义一个类,实现Comparator接口,覆盖compara方法(此种方法 ...

  4. 如何将本地的jar包上传到maven本地仓库中

    首先需要将本地的jar包做mvn install到本地仓库中 mvn install:install-file -Dfile=D:\skyeye-ruleInfo\lib\lucene-querypa ...

  5. >hibernate.cfg.xml的一些常用配置

    1.数据库的基本配置信息 hibernate.connection.driver_class是配置数据库驱动 hibernate.connection.url是配置数据库的url hibernate. ...

  6. SMA、SMB、SMC封装的二极管

    以常见的贴片肖特基二极管SS14 SS24 SS34为例,三种管子区别主要在电流上,有三种封装:SMA.SMB.SMC. 从成本和体积来说,优先选用最小尺寸的SMA/DO-214AC封装,其他封装一般 ...

  7. WCF 程序入门

    WCF是微软公司推出的符合SOA思想的分布式应用程序技术框架和编程模型,是建立在消息通信这一概念基础上运行的一个运行时服务系统. WCF编程模型的目标是实现以下两个实体之间的通信:WCF服务端和WCF ...

  8. Think in 递归

    网上写递归的文章可以用汗牛充栋来形容了,大多数都非常清晰而又细致的角度上讲解了递归的概念,原理等等.以前学生的时候,递归可以说一直是我的某种死穴,原理,细节我都懂,但是不管是在如何运用或者如何试试算法 ...

  9. 如何解决Maple的应用在数学中

    对任意数学和技术学科的研究员.教师和学生而言,Maple是一个必备的工具.通过Maple,教师将复杂数学问题注入生命,学生的精力集中在概念理解上而不是如何使用工具上,研究员可以开发更复杂的算法或模型. ...

  10. 有了lisk,为什么我们还要做一个Asch?

    0 前言 首先要声明一点,我们和我们的一些朋友都是lisk的投资人和支持者,我们也相信lisk会成功. 事实上,lisk已经成功了一半,目前在区块链领域融资金额排行第二,仅次于以太坊. 那为什么我们还 ...