Lua的require机制
今天仔细读了文档,弄清楚了Lua的模块require机制。
Lua是通过require函数来加载模块的,只需提供模块的名字,即可通过require(modname)来加载模块。
Lua是如何通过modname来载入.lua或.so的呢?
默认加载过程
package.loaded[modname]中存了模块的数据,有则直接返回
顺序遍历package.searchers,获取loader
package.preload[modname]
Lua Loader, 通过package.searchpath搜索package.path
C Loader, 通过package.searchpath搜索package.cpath
All-In-One loader
调用loader载入模块
将载入结果保存至package.loaded[modname]并返回结果
可用lua模拟载入过程:
function findloader(modname)
loc ...
Lua源码分享 Gc篇(三)流程之创建对象
[TOC]
前面两篇主要介绍一些基础,帮助后面gc流程理解的。像是饭前的开胃菜一般,让你后面容易吃的更多。接下来几篇都是gc流程相关
这里列出几个问题,你可以直接跳过。当然,有所了解的按照自己的理解去回答一下,或许会有一些新的想法。如果你都会回答的很清晰了,那么接下来的系列几乎可以不怎么看了。
(1)对象的颜色变化过程?
(2)新创建对象和gc流程是怎么关联的?
(3)什么时候gc?
(4)增量式gc体现在哪?
gc的流程,按照程序状态分为:
/*
** Possible states of the Garbage Collector
*/
#define GCSpause 0
#define GCSpropagate 1
#define GCSsweepstring 2
#define GCSsweep 3
#define GCSfinalize 4
1.初始化阶段
2.扫描阶段
3.回收阶段(字符串)
4.回收阶段
5.结束阶段
接下来,主要讲一下新创建对象是怎么和gc关联的。因为gc所需要的对象都是在某个地方创建出来的,并且 ...
2.3 lua 表达式
算术表达式Lua 的算术运算符如下表所示:
表达符
备注
+
加法
-
减法
*
乘法
/
除法
^
指数
%
取模
实例123456789print(1 + 2) print(5 / 10) -->打印 0.5。 这是Lua不同于c语言的print(5.0 / 10) -->打印 0.5。 浮点数相除的结果是浮点数-- print(10 / 0) -->注意除数不能为0,计算的结果会出错print(2 ^ 10) -->打印 1024。 求2的10次方local num = 1357print(num % 2) -->打印 1print((num % 2) == 1) -->打印 true。 判断num是否为奇数print((num % 5) == 0) -->打印 false。判断num是否能被5整数
关系表达式
表达符
备注
<
小于
>
大于
<=
小于等于
>=
大于等于
==
等于
~=
不等于
12345print(1 < ...
Lua入门教程:模块与包
Lua 从 5.1 版本开始为模块与包定义了一系列规则,这些规则不需要引入额外的功能特性。对用户来说,一个模块就是一些代码,这些代码可以通过 require 函数加载。
值得注意的是,从 Lua 5.2 开始编写模块的建议方式已经发生改变,而不在是 Lua 5.1 中的 module(“mymodule”, package.seall) 。现在根据推荐的是创建一个本地表,将所有模块函数放入其中并返回表,其最大的区别是不会再使用全局命名空间来注册模块。
模块的基本方法定义一个简单的模块,该模块在文件 test_module.lua 中,其模块有两个函数 foo 和 bar:
12345678910111213local M = {}function () print("foo")endfunction M.bar() print("bar")endreturn M
另外,还有一种编写模块的方法是把所有函数定义为局部变量,然后在最后构造模块并返回一个表:
1234567891011121314local function foo() pri ...
Lua函数 · 花生肉泥
函数的构建lua编程语言函数定义格式如下:1234optional_function_scope function (argument1,argument2,argument3...,argumentn) function_body return result_parames_comma_separatedend
【解析】
optional_function_scope:该参数是否选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要关键字local
function_name:指定函数名称
argument1,argument2,argument3…argumentn:函数参数,多个参数以逗号隔开,函数也可以不带参数
function_body:函数体,函数中需要执行的代码语句块
return_params_comma_separated;函数返回值,lua语言函数可以返回多个值,每个值以逗号隔开12345678910111213141516171819function max(num1,num2) if(num1 ...
lua虚拟机概述
何为虚拟机用于模拟计算机运行的程序.是个中间层,它处于脚本语言和硬件之间的一个程序.每一门脚本语言都会有自己定义的opcode(”操作码”),可以理解为这门程序自己定义的”汇编语言”.一般的编译型语言,比如C等,经过编译器编译之后生成的都是与当前硬件环境相匹配的汇编代码;而脚本型的语言,经过前端的处理之后,生成的就是opcode,再将该opcode放在这门语言的虚拟机中执行.虚拟机是作为单独的程序独立存在,而Lua由于是一门嵌入式的语言是附着在宿主环境中的.
lua代码到虚拟机执行的流程
在Lua中,Lua代码从词法分析到语法分析再到生成opcode,最后进入虚拟机执行的大体流程是什么样子的呢?
Lua的API中提供了luaL_dofile函数,它实际上是个宏,内部首先调用luaL_loadfile函数,加载Lua代码进行语法,词法分析,生成Lua虚拟机可执行的代码,再调用lua_pcall函数,执行其中的代码:
#define luaL_dofile(L, fn)
(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA ...
Lua变量 · 花生肉泥
lua中有三种变量:全局变量,局部变量,还有table的域
在变量的首次赋值之前,变量的值均为nil
全局变量全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil123print(a) a = 1print(a) -- 1
当你想删除一个全局变量,只需要将变量赋值为nil
当且仅当一个变量不等于nil时,这个变量存在
局部变量局部变量有其作用范围,局部变量可以被定义在它作用范围中的函数自由使用,局部变量可以在语句块总任何地方申明,应该尽可能的使用局部变量,好处有两个
1.避免命名冲突
2.访问局部变量的速度比全局变量更快1234567891011121314151617a = 5 -- 全局变量local b = 5 -- 局部变量function () c = 5 -- 全局变量 local d = 6 -- 局部变量endjoke()print(c,d) -- 5 nildo local a = 6 -- 局部变量 ...
如何用 openresty + lua 快速搭建一个简单网站
最近在折腾 OpenResty,OpenResty 就不用多介绍了,这方面国内质量好的资料也不多,如果非要选一个入门级别的资料,自然是《OpenResty 最佳实践》。断断续续看了一些 Lua 的语法和 OpenResty 基础,就想做点什么练练手。碰巧某天。同事介绍了几个 OpenResty 的 lua 库,一看刚刚好,可以做来搭个简单的网站。那么我们就开始吧…
安装 OpenResty在上一篇文章,记录了几个 Mac 安装 openresty 的几个坑。有兴趣的可以看看,不多介绍了。
搭建项目项目目录很简单,刚刚介绍的那个 lua 库 lua-resty-template,看库的名字就知道这是个模板相关的库,主要是提供模板渲染的功能。有一些自己的模板语法,这和其他语法的模板语法一样的。
项目目录结构如下:1.
├── conf
│ └── nginx.conf
├── html
│ ├── _base.html
│ └── view.html
├── lua_file
│ └── content.lua
├── readme.md
└── requirements. ...
ulua热更新小试
传说中的热更新在Unity中是怎样实现的:)
写在前面 热更新技术在游戏行业可以说是大名鼎鼎了,虽然苹果前段时间禁止了JSPatch等热更新技术,但目前来看,苹果并没有禁止游戏引擎的热更新技术。某种程度上说明了热更新在游戏中的重要性。而ulua作为一款优秀的unity3d热更新插件,完美解决了Unity游戏热更新的问题。
什么是热更新 热更新一般用于网络游戏中。其指的是在不重新下载客户端的情况下,对游戏的内容进行更新(包括资源更新或逻辑更新等)。知乎上对热更新有一个很形象的比喻:假设你的卡车开到了150KM/H,然后有个轮胎爆了。司机说,你就直接换吧,我不停车。你小心点换。热更新机制大概就是这个意思。
什么是Lua Lua是一款轻巧的脚本语言,由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。(嗯这段其实是百度的orz…)
Lua代码都是运行时才编译的,不运行的时候就如同一张图片、一段音频一样,都是文件;所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻 ...
Lua数据结构 — Table(三)
文章目录
</div>
<p>前面(一)、(二)里面其实已经把一些常用的数据类型(数值、布尔、字符串)说明了,这次要描述的是Table,Table在Lua里是一种常用的数据类型,是Lua里的精髓之一,其效率必须得到保证,而实现这种支持任意类型key和value的Table也是较为复杂的。</p>
一、 Table的设计思想1、 首先,讲一下Lua要设计的Table是怎么样子的:
Lua就是想做这种支持任意类型的key和任意类型val的table,并且要高效和节约内存。
2、 基本的实现(基于链表的实现):
基于链表的实现是最简单的,其实map就可以了,这样实现是最容易的。但当遇到很多key的数组(如t[0]、t[1]、t[2]。。这种数值索引大数组)时,明明可以用O(1)查找的,却要O(n)去查找。
3、 区分数字key和其它类型的key
经过改良的Table,除了有key链表之外,还有一个数组array专门存放key为数值的val。但是这种情况下,要保证数值部分是连续且从0开始的,如果 ...