Lua的简单学习


=Start=

缘由:

项目需要。

内容:
0.Lua是什么?

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

1.Lua的安装
curl -R -O http://www.lua.org/ftp/lua-5.3.2.tar.gz
tar zxf lua-5.3.2.tar.gz
cd lua-5.3.2

# Linux
make linux
sudo make install

# Mac
make macosx
sudo make install
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函数测试给定变量或者值的类型

nil         # nil类型表示一种没有任何有效值,它只有一个值即nil;对于全局变量和 table,nil 还有一个"删除"作用
boolean     # true / false
number      # 双精度
string      # 单引号、双引号、2个方括号
userdata    # 一种用户自定义数据
function    # 函数
thread      #
table       # Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。

05.Lua 循环

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

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

while(condition) do
    statements
end

for var=first, last, step do
    statements
end

for i, v in ipairs(a) do
    print(i, v)
end

for k, v in pairs(a) do
    print(k, v)
end

repeat
    statements
while( condition )

06.Lua 的控制结构

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

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

if(布尔表达式) then
    --[ 在布尔表达式为 true 时执行的语句 --]
end

if(布尔表达式) then
    --[ 在布尔表达式为 true 时执行的语句 --]
else
    --[ 在布尔表达式为 false 时执行的语句 --]
end

if( 布尔表达式 1) then
    --[ 在布尔表达式 1 为 true 时执行该语句块 --]
else if( 布尔表达式 2)
    --[ 在布尔表达式 2 为 true 时执行该语句块 --]
else if( 布尔表达式 3)
    --[ 在布尔表达式 3 为 true 时执行该语句块 --]
else
    --[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
end

07.Lua 函数定义

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

-- Lua 编程语言函数定义格式如下:
[local] function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end

可变参数

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

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

function average(...)
   result = 0
   local arg={...}
   for i,v in ipairs(arg) do
      result = result + v
   end
   print("总共传入 " .. #arg .. " 个数")
   return result/#arg
end
print("平均值为", average(10,5,3,4,5,6))

多返回值

在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=

, ,

《 “Lua的简单学习” 》 有 8 条评论

  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

  2. 编程语言 – Lua 全教程
    https://ialloc.org/posts/2017/11/17/programming-in-lua/
    `
    Lua 简介
    Lua 版本
    Lua 环境
      开发工具
      软件包管理
      分析和调试
    基础概念
      常量和标识符
      变量和数据类型
      表达式(expression)
      语句(statement)
    惯用法
    高级特性
      高级语法结构
        元表(metatable)
        环境(environment)
        闭包(closure)
        协程(coroutine)
      代码组织
        模块(module)
          定义模块
          使用模块
          模块查找
      包(package)
      面向对象
      语言互操作
        C API
        FFI
    其它
      命令行参数
      装饰器
    优化建议
    常用类库
    参考资料
    Footnotes
    `

发表回复

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