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. tf-idf知多少?

    1.最完整的解释 TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反 ...

  2. VS加入全局缓存

    1. 加载 gacutil.exe /i <DLL Name>.dll 2. 卸载 gacutil.exe /u <DLL Name>

  3. mongodb搭建和基本语法

    下载安装包 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.0.0-signed.msi?_ga=1.2206 ...

  4. ASP.NET SignalR 高可用设计

    在 One ASP.NET 的架构图中,微软将 WebAPI 和 SignalR 归类到 Services 类型与 MVC.Web Forms 同列为一等公民,未来的 ASP.NET 5 尽管还在be ...

  5. Visual Studio 2013 Ultimate的可视化代码功能

    可视化和了解代码综合了如何使用visual studio可视化代码来帮助理解代码: 理解代码和代码之间的关系:(1)Code Map(2)Dependency Graphs 理解代码交互:Sequen ...

  6. ABP理论学习之MVC视图

    返回总目录 本篇目录 介绍 AbpWebViewPage基类 介绍 ABP通过Abp.Web.Mvc Nuget包集成了MVC视图.因此你可以像常规那样创建MVC视图. AbpWebViewPage基 ...

  7. Lesson 8 The best and the worst

    Text Joe Sanders has the most beautiful garden in our town. Nearly everbody enters for 'The Nicest G ...

  8. Jenkins常用插件说明(持续更新)

    本文主要记录在学习以及使用Jenkins过程中常用的对我们有帮助的插件,同时本文将会持续进行更新.如果大家发现有其他野很好用的插件,也欢迎参照下面的格式,在评论中进行回复反馈. 一.通用插件 1.Em ...

  9. Linux学习之Exam系统发布

    配置时间:2015年11月27日 配置人:撰写人:微冷的雨   Happy 01.Linux安装图 欢迎页面 桌面 02.Linux命令之文件目录操作 给北大青鸟五道口校区创建三个机房(L4,L5,L ...

  10. JavaScript css-dom

    HTML负责结构层,网页的结构层由HTML或者XHTML之类的标记语言负责构建 CSS负责表示层,描述页面内容应该如何呈现. JavaScript负责行为层,负责内容应该如何响应事件这一问题. 能利用 ...