1、Lua官网
http://www.lua.org/manual/5.3/manual.html
2、Lua与Java的比较
3、Lua与LuaJIT比对
http://luajit.org/performance_x86.html
4、Lua语法实战
【syntax】
0> 在 Lua 中,一共只有 9 种数据类型,分别为 nil 、boolean 、lightuserdata 、number 、string 、 table 、 function 、 userdata 和 thread。
=>其中,只有 string table function thread 四种在 vm 中以引用方式共享,是需要被 GC 管理回收的对象。其它类型都以值形式存在。
0> lua中 nil和false返回值都是假。
1> 【..】表示连接字符串
=>不能连接nil值,attempt to concatenate local 'http_uri_arg_value' (a nil value)=>error
2> lua函数可以返回多个变量
3> 【local】标识局部变量
4> 通过nginx变量取uri,但获取不到参数,如下:
-- 请求中的当前URI(不带请求参数,参数位于$args)
local uri = ngx.var.uri
5> 获取uri中的指定参数
local user = ngx.var.arg_user -- 定义user变量并获取url中的参数 http://localhost?user=hello
6> 跳转
return responses.send(status_code, message)
7> ngx.print vs ngx.say => say会多输出一空行
8> false和nil为假, true和 not nil为真, 0 也为真!
9> lua标识空采用nil
10> elseif,区别于 else if;
11> and & or,不支持问号表达式;lua中0表示true;
12> no continue,lua 中不支持 continue 语法;需要用 if 和 else 语句实现;
13> . & :,lua 中 object.method 和 object:method 行为不同,object:method 为语法糖,会扩展成第一个参数为 self
14> forgot return _M,在编写模块的时候如果最后忘记 return _M, 调用时会提示尝试对 string 调用方法的异常
15> 事实上,一个lua_State也是一个类型为 thread 的 GCObject 。
16> mainthread 一定是 GCObject 链表上的最后一个节点(除 Udata 外),这是因为挂接过程都是向链表头添加的。
17> 一个完整的 lua 虚拟机在运行时,可有多个lua_State,即多个 thread 。它们会共享一些数据。这些数据放在global_State *l_G域中。其中自然也包括所有 GCobject 的链表。
18> 线程(thread)作为Lua中一种基本的数据类型,它代表独立的执行线程(independent threads of execution),
线程类型是实现协程(coroutines)的基础,注意这里的线程类型不要与操作系统线程混淆,Lua的线程类型是Lua虚拟机实现一种数据类型。
19> Lua线程状态
//////////begin////////
44 /* thread status */
45 #define LUA_OK 0
46 #define LUA_YIELD 1
47 #define LUA_ERRRUN 2
48 #define LUA_ERRSYNTAX 3
49 #define LUA_ERRMEM 4
50 #define LUA_ERRGCMM 5
51 #define LUA_ERRERR 6
///////////end//////////
20> 在调用lua_newstate 初始化Lua虚拟机时,会创建一个全局状态和一个线程(或称为调用栈),这个全局状态在整个虚拟机中是唯一的,供其他线程共享。
一个Lua虚拟机中可以包括多个线程,这些线程共享一个全局状态,线程之间也可以调用lua_xmove函数来交换数据。
21> luaV_execute 是Lua VM 执行一段字节码的入口。Lua VM 就是一个状态机,从当前调用栈上次运行点开始解释字节码指令,
直到下一个 C 边界跳出点(可以是函数执行完毕,也可以是一次协程 yield 操作)
22> 所有的指令都会操作寄存器 A ,从 Lua VM 的角度看,寄存器就是数据栈上的变量,所以可以将寄存器 A 所指变量预先取出放到局部变量ra 中。
ra = RA(i)。某些指令操作在 vm 运行过程中会改变数据栈的大小(伸缩),而 ra 是一个指向数据栈的指针,而不是一个索引。这种情况下,一旦数据栈发生变化,就需要重新获取ra的值。
23> ngx_lua模块的原理:
=>1、每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;
=>2、将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;
=>3、每个外部请求都由一个Lua协程处理,协程之间数据隔离;
=>4、Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;
=>5、I/O等异步操作完成时还原相关协程上下文数据,并继续运行;
24> Table
=>table 库是由一些辅助函数构成的,这些函数将 table 作为数组来操作
=>在初始化一个数组的时候,若不显式地用键值对方式赋值,则会默认用数字作为下标,从 1 开始。
由于在 Lua 内部实际采用哈希表和数组分别保存键值对、普通值,所以不推荐混合使用这两种赋值方式。
=>任何一个nil值都有可能被当成数组的结束,这也就说明对于有“空洞”的情况,table 的长度存在一定的不可确定性。
=>不要在 Lua 的 table 中使用 nil 值,如果一个元素要删除,直接 remove,不要用 nil 去代替。
=>table.maxn (table),该函数的开销相比 # 运算符也会更大一些。
=>问题:用哈希表存储键值对时,可以取到key的顺序位置?比如第1个参数,第2个参数,……
=>获取url参数 ngx.var.arg_xx与ngx.req.get_uri_args["xx"]两者都是为了获取请求uri中的参数
///////begin//////
local strider = ngx.var.arg_strider
local strider = ngx.req.get_uri_args["strider"]
////////////end///////////
=>URI 内容传递过程中是需要调用 ngx.encode_args 进行规则转义
26> String
=>使用 string.byte 来进行字符串相关的扫描和分析是最为高效的
=>应当总是使用 # 运算符来获取 Lua 字符串的长度
=>对于 LuaJIT 这里有个性能优化点,对于 string.find 方法,当只有字符串查找匹配时,是可以被 JIT 编译器优化的
=>print(find("abc cba", "(%a+)", 1, true))
>>>>string.reverse (s)
>>>>string.find(s, p [, init [, plain]])=>find("abc cba", "(%a+)", 1, true) =>第4个参数默认是false,建议仅匹配字符串,设置为true
=>string.find (s, pattern [, init [, plain]]) =>_, q=string.find("haha", 'ah')=>通过虚拟变量替代不需要的返回值
=>strig.sub(a,1,3) In particular, the call string.sub(s,1,j) returns a prefix of s with length j, and string.sub(s, -i) (for a positive i) returns a suffix of s with length i
27> 判断字符串长度
//////////begin/////////
if conf.whitelist and #conf.whitelist > 0 then
block = not iputils.binip_in_cidrs(binary_remote_addr, cidr_cache(conf.whitelist))
end
/////////end///////////
28> 特殊字符【_】标识虚变量dummy variable,
=> 虚变量不仅仅可以被用在返回值,还可以用在迭代等
=> 当有多个返回值需要忽略时,可以重复使用同一个虚变量
for example:用于ipairs
////////////begin/////////
for _, location in ipairs {"body", "headers", "querystring"} do
plugin.config[action][location] = plugin.config[action][location] or {}
end
/////////end///////////
- 大小: 86.6 KB
分享到:
相关推荐
以下是对Lua学习的一些关键知识点的详细介绍: 1. **基础语法**:Lua的语法与C语言类似,包括变量(全局和局部)、赋值、数据类型(如数字、字符串、布尔、表、函数和nil)。变量在Lua中是动态类型的,不需要预先...
首先,从标题和描述中我们可以看出,这个资料包专门针对Lua学习,反复提及“lua学习资料”,表明其内容可能包括教程、示例代码、练习题等,全面覆盖了学习的各个环节。 在标签中提到了“lua 课程资源”,这可能意味...
### Lua学习入门教程 #### 一、引言 本文旨在为初学者提供Lua脚本语言的基础教程。假设读者已经具备一定的编程基础,如了解Basic或C等语言的基本概念。Lua是一种轻量级、高效的脚本语言,常用于游戏开发和其他需要...
这个"lua学习资料集锦"显然包含了丰富的资源,帮助初学者系统地学习和理解Lua语言。以下是一些关于Lua的基本知识点和核心概念: 1. **基本语法**:Lua具有简洁的语法,支持变量声明、流程控制(如if语句、for循环、...
这个"Lua学习框架代码"提供了一个基础的学习平台,帮助初学者更好地理解和掌握Lua编程。下面将详细介绍Lua的一些核心概念和特性,以及如何通过这个框架进行学习。 1. Lua的基础语法: - 变量:Lua中的变量没有类型...
本资源包包含了学习LUA的重要参考资料,包括《Programming in Lua》这本书、《Lua 5.1 参考手册》以及LUA 5.0.2的解释器。 《Programming in Lua》是由Pierre Giraud和Luiz Henrique de Figueiredo合著的一本权威...
在Android项目中使用Lua,需要两个步骤: 1、加载Lua脚本解析引擎。 2、以Native API方式调用引擎接口 直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )...
以下是基于VC环境的lua学习中的一些核心概念和步骤: 1. **安装与配置**: 在VC环境中使用lua,首先需要下载lua的源码,并使用Visual Studio打开项目文件进行编译。这将生成lua的动态链接库(.dll)和静态链接库...
“lua 学习”这个描述意味着我们将关注Lua的基础知识,包括语法、数据类型、控制结构、函数、表(Lua中的核心数据结构)以及模块化编程。让我们深入探讨一下这些关键概念: 1. **基础语法**:Lua的语法简洁明了,...
这个"lua学习课件"包含的资源旨在帮助你深入理解Lua语言的基础和高级概念,提升你的编程技能。 首先,从标题我们可以推断,这个压缩包包含了一系列关于Lua的学习材料。学习课件通常涵盖课程大纲、讲义、练习题和...
在这个"lua学习库"中,你将找到一系列资源来帮助你深入理解和掌握Lua语言。 首先,让我们来探讨一下Lua的基础知识。Lua语法简洁明了,它支持变量、数据类型、控制结构(如if语句和循环)、函数以及表(作为其主要的...
这份"lua入门学习资料"包含两本经典书籍《lua编程指南》和《lua程序设计》,以及一些简单的例程,将帮助你快速步入Lua的世界。 《lua编程指南》是一本很好的入门书籍,它详细介绍了Lua的基本语法和特性。在书中,你...
学习lua的阶段总结。请使用xmind打开
【标题】"Lua 学习:源代码与C++封装及Demo示例" 【内容】 在IT行业中,Lua是一种轻量级的脚本语言,因其简洁的语法和高效的执行性能,常被用作游戏开发、嵌入式系统以及服务器配置等领域的辅助编程语言。本文将...
Lua是一种轻量级的脚本语言,常被用于游戏开发,因为它语法简洁,易于学习,且与C/C++等系统编程语言集成良好。在游戏开发中,Lua常常作为游戏逻辑和用户界面的控制层,而游戏的核心部分则由更底层的语言编写,以...
在Lua中,你可以学习到如何声明变量(全局和局部),使用基本的数据类型如字符串、数字、布尔值和表(Lua中的数组或字典)。你还将接触到流程控制语句,如条件语句(if...then...end)和循环(for和while)。此外,...
表是Lua的通用数据结构,可以用来实现数组、集合、记录等多种数据结构。 接下来,"通过例子学LUA"文档则提供了实践性的学习途径。通过实际的代码示例,你可以了解如何在Lua中进行基本操作,如变量声明、运算符使用...
作为一本完备的Lua学习手册,本手册涵盖了Lua语言的基本概念、语法规则、表达式和控制结构,到高级特性如元表、环境、垃圾回收、协同例程以及C语言API接口的全面介绍。 1. Lua简介 Lua是一种动态类型、解释执行的...