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. js获取HTTP的请求头信息

    以下为js获取HTTP的全部请求头信息: var req = new XMLHttpRequest(); req.open('GET', document.location, false); req. ...

  2. JavaWeb中读取文件资源的路径问题

    在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节.字符流来将这个文件读取到内存 ...

  3. springMVC+spring+hibernate 框架整合实例

    先说一下流程思路: 流程讲解1:首先访问会先定位到控制器.这就用到了过滤器配置文件"spring-mvc.xml".这个文件负责定义控制器的包路径.视图的格式等.其次从" ...

  4. laravel5.2,注册服务提供者时无法生效

    laravel中注册服务提供者原本很简单,只要运行下指令php artisan make:provider TestServiceProvider,然后在config/app.php的provider ...

  5. Redis 排行榜 相同分数根据时间优先排行

      版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 需求 Redis 提供了按分数进行排序的有序集合. 比如在游戏里面,比如战斗力排行,充值排行,用默认的Redis 实现就可以达到需求. ...

  6. TP5与TP3.X对比

    首先声明本章节并非是指导升级旧的项目到5.0,而是为了使用3.X版本的开发者更快的熟悉并上手这个全新的版本.同时也强烈建议开发者抛弃之前旧的思维模式,因为5.0是一个全新的颠覆重构版本. 需要摒弃的3 ...

  7. offsetTop、clientTop、scrollTop、offsetTop属性

    HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对 ...

  8. HTML Help WorkShop 创作、调用方法和技巧

    一.在CHM 文件中所用到的弹出式菜单: 二.在HTML Help WorkShop 中不用显示的样式   (1).从右到右阅读顺序. (2).对话框 (3).滚动条在左边 (4).仅展开单个标题   ...

  9. 测试MailUtils,作用是发邮件

    package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...

  10. 一小时包教会 —— webpack 入门指南

    什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以 ...