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. 开源一个C#写的Android和IOS都能跑的 打击感强的RPG玩玩。

    攒到 250楼再统一发一次代码,各位 给力啊 156楼之前的兄弟 都已经发送代码了!各位查收一下!   156楼之后的兄弟要晚上统一发送 200楼之前的兄弟都已经发送代码了!  各位查收一下!!!顺便 ...

  2. <十三>JDBC_dbcp数据库连接池

    配置文件:jdbc.properties username=rootpassword=kkdriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://1 ...

  3. effectiveC++ 内存管理 学习笔记

    1.尽量使用初始化列表而不要再构造函数里赋值,初始化顺序和声明的顺序一致,一些类型如const,引用等,必须使用初始化.对于非内部数据类型成员对象应当采用初始化表,以获取更高的效率.example:B ...

  4. .net网站常见问题及解决方案

    1.   解决方法: 三个文件放到项目Bin文件夹     2. 解决方法 : requestValidationMode="2.0" 加到 3. 你在浏览器输入网址报这样的错误 ...

  5. 判断是否为mac电脑 、还是windows操作系统

    /** * 是否为mac系统(包含iphone手机) * */ var isMac = function() { return /macintosh|mac os x/i.test(navigator ...

  6. 使用DataList实现数据分页的技术

    今天做网站的时候,用到了分页技术,我把使用方法记录下来,以便日后查阅以及帮助新手朋友们. DataList控件可以按照列表的形式显示数据表中的多行记录,但是被显示的多行记录没有分页功能,使用起来不太方 ...

  7. FAT32 FAT区__FAT表解析

    一. FAT 表概述 位置: 紧跟在文件系统的“保留区”之后 : 有两个数据结构完全相同的FAT(FAT,File Allocation Tbale 文件分配表)组成. 作用: FAT表项,描述文件系 ...

  8. opencv算法学习

    1.改变图像的亮度和对比度: 算法介绍:对每一点像素值的r,g,b,值进行乘法和加法的运算. 代码使用: ; y < image.rows; y++ ) { ; x < image.col ...

  9. AngularJs项目文件以及文件夹结构

    app/ ----- Libs/ // references for all libs ---------- angular.js ---------- angular-route.js ----- ...

  10. .Net组件程序设计之线程、并发管理(一)

    .Net组件程序设计之线程.并发管理(一) 1.线程 线程 线程的创建 线程的阻塞 线程挂起 线程睡眠 加入线程 线程中止 现在几乎所有的应用程序都是多线程的,给用户看来就是一个应用程序界面(应用程序 ...