Lua的简单学习

=Start=

缘由:

项目需要。

内容:
0.Lua是什么?

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

1.Lua的安装

2.Lua的语法

01.Lua 是一个区分大小写的编程语言。因此在 Lua 中 CrazyOf 与 crazyof 是两个不同的标识符。

02.Lua的注释

03.Lua的变量

Lua 的变量有三种类型:全局变量、局部变量、表中的域。
函数外的变量默认为全局变量,除非用 local 显示声明(在默认情况下,变量总是认为是全局的)。函数内变量与函数的参数默认为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束(或者是直到下一个同名局部变量的声明)。

变量的默认值均为 nil。

全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。

如果你想删除一个全局变量,只需要将变量赋值为nil。这样变量就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在

04.Lua 的数据类型

Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。值可以存储在变量中,作为参数传递或结果返回。

Lua中有8个基本类型,分别为:nil、boolean、number、string、userdata、function、thread和table我们可以使用type函数测试给定变量或者值的类型

05.Lua 循环

Lua 语言提供了以下几种循环处理方式:

while循环:在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。
for循环:重复执行指定语句,重复次数可在 for 语句中控制。
repeat…until循环:重复执行循环,直到指定的条件为真时为止。

06.Lua 的控制结构

if语句
if…else语句
if嵌套语句

控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true 和非nil为真

07.Lua 函数定义

Lua 编程语言函数定义格式如下:

可变参数

Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(…)表示函数有可变的参数。Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数

例如,我们计算几个数的平均值:

多返回值

在Lua函数中,在return后列出要返回的值的列表即可返回多值。

08.Lua 运算符

运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。Lua提供了以下几种运算符类型:

算术运算符(加减乘除、取余、幂、负号)
关系运算符(不等于 ~=)
逻辑运算符(and / or / not)
其他运算符([..]连接两个字符串,[#]返回字符串或表的长度)

09.Lua 字符串

Lua 中的字符串或串(String)是由数字、字母、下划线组成的一串字符。Lua 语言中字符串可以使用以下三种方式来表示:

单引号间的一串字符
双引号间的一串字符
[[和]]间的一串字符  #一般用于表示多行字符串

各种字符串操作以及对应的内置函数(string.upper(str)
string.lower(str)
string.reverse(str)
string.strfind (str, substr, [init, [end]])
string.gsub(mainString, findString, replaceString, num)
string.format(…))。

0x.Lua 中的table

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。

常用的table操作:

  • table.concat(table [, step [, start [, end]]]) # 用sep符号连接table元素
  • table.insert(table, [pos,] value) # 在table中的指定位置进行插入
  • table.remove(table [, pos]) # 删除table中指定位置的元素
  • table.sort(table [, comp]) # 对给定的table进行升序排序

对Lua中的table不太理解的地方:

Lua中table的长度到底是怎么算的?
Lua中table的长度到底是怎么算的?
3.Lua的应用
  • 游戏开发
  • 独立应用脚本
  • 扩展和插件如:Nmap / Wireshark / …
  • Lua+Nginx组合:WAF / OpenResty / …
参考链接:
Lua教程

http://coolshell.cn/articles/10739.html
http://www.runoob.com/lua/lua-tutorial.html
http://www.lua.org/pil/1.html
http://wiki.jikexueyuan.com/project/lua/
https://www.ttlsa.com/lua/
https://wizardforcel.gitbooks.io/w3school-lua/content/
https://zh.wikipedia.org/zh-cn/Lua
http://www.phailed.me/2011/02/learn-lua-the-hard-way-1/

Awesome Lua

https://github.com/LewisJEllis/awesome-lua
https://github.com/forhappy/awesome-lua

Nginx和Lua

https://github.com/openresty/lua-nginx-module
https://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
http://huoding.com/2012/08/31/156
http://wulijun.github.io/2012/09/04/nginx-lua.html

OpenResty

https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx_lua/lua-limit.html
https://www.centos.bz/2012/12/openresty-nginx-block-cc-attack-deploy/

=END=

声明: 除非注明,CrazyOf.me文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://crazyof.me/blog/archives/2641.html

《Lua的简单学习》上有2条评论

  1. 对于文中「对Lua中的table不太理解的地方」的解释为:
    在 Lua 中,数组下标从 1 开始计数。在初始化一个数组的时候,若不显式地用键值对方式赋值,则会默认用数字作为下标,从 1 开始。由于在 Lua 内部实际采用哈希表和数组分别保存键值对、普通值,所以不推荐混合使用这两种赋值方式。
    对于常规的数组,里面从 1 到 n 放着一些非空的值的时候, 它的长度就精确的为 n,即最后一个值的下标。

    所以,对应的建议就是:
    一、不要混用;
    二、如果你要删除一个数组中的元素,请使用 remove 函数,而不是用 nil 赋值。

    参考:
    https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/table_library.html
    https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/array_size.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注