参考:https://www.w3cschool.cn/lua/...

Lua装置

装置环境:cento7

curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gztar zxf lua-5.3.0.tar.gzcd lua-5.3.0make linux testmake install

如果遇到以下谬误:

fatal error: readline/readline.h: No such file or directory

装置libreadline-dev依赖包

yum install -y readline-devel

HelloLua

创立一个helloLua.lua文件,输出

print("Hello Lua!")

保留后执行

lua helloLua.lua

根本语法

交互式运行

lua -i

正文

单行正文

-- 这是一个单行正文

多行正文

--[[ 多行正文 多行正文 --]]

标示符

Lua 标示符用于定义一个变量,函数获取其余用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 结尾后加上0个或多个字母,下划线,数字(0到9)。

最好不要应用下划线加大写字母的标示符,因为Lua的保留字也是这样的。

Lua 不容许应用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个辨别大小写的编程语言。

关键词

以下列出了 Lua 的保留关键字。保留关键字不能作为常量或变量或其余用户自定义标示符:

andbreakdoelse
elseifendfalsefor
functionifinlocal
nilnotorrepeat
returnthentrueuntil
while

个别约定,以下划线结尾连贯一串大写字母的名字(比方 _VERSION)被保留用于 Lua 外部全局变量。

全局变量

在默认状况下,变量总是认为是全局的。

全局变量不须要申明,给一个变量赋值后即创立了这个全局变量,拜访一个没有初始化的全局变量也不会出错,只不过失去的后果是:nil。

数据类型

Lua是动静类型语言,变量不要类型定义,只须要为变量赋值。 值能够存储在变量中,作为参数传递或后果返回。

Lua中有8个根本类型别离为:nil、boolean、number、string、userdata、function、thread和table。

数据类型形容
nil这个最简略,只有值nil属于该类,示意一个有效值(在条件表达式中相当于false)。
boolean蕴含两个值:false和true。
number示意双精度类型的实浮点数
string字符串由一对双引号或单引号来示意
function由 C 或 Lua 编写的函数
userdata示意任意存储在变量中的C数据结构
thread示意执行的独立线程,用于执行协同程序
tableLua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引能够是数字或者是字符串。在 Lua 里,table 的创立是通过"结构表达式"来实现,最简略结构表达式是{},用来创立一个空表。

应用type函数测试给定变量或者值的类型

Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型能够批改 luaconf.h 里的定义)

字符串

字符串由一对双引号或单引号来示意。

也能够用 2 个方括号 "[[]]" 来示意"一块"字符串。

html = [[<html><head></head><body>    <a href="//www.w3cschool.cn/">w3cschoolW3Cschool教程</a></body></html>]]print(html)

在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字

lua应用..来连贯字符串

> print("123" .. 456)123456

table(表)

在 Lua 里,table 的创立是通过"结构表达式"来实现,最简略结构表达式是{},用来创立一个空表。也能够在表里增加一些数据,间接初始化表:

-- 创立一个空的 tablelocal tbl1 = {}-- 间接初始表local tbl2 = {"apple", "pear", "orange", "grape"}

获取数据

> tbl2 = {"a","b","c"}> print(tbl2)table: 0x1e63070> print(tbl2[1])a---------------> a = {}> a["aKey"] = "aVlue"> print(a["aKey"])aVlue> for k,v in pairs(a) do>> print(k .. " : " .. v)>> endaKey : aVlue

不同于其余语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引个别以 1 开始。

function(函数)

编辑一个luaFunction.lua文件,输出以下内容

function factorial1(n)    if n == 0 then        return 1    else        return n * factorial1(n - 1)    endendprint(factorial1(5))factorial2 = factorial1print(factorial2(5))

执行

lua luaFunction.lua120120

function 能够以匿名函数(anonymous function)的形式通过参数传递

-- function_test2.lua 脚本文件function anonymous(tab, fun)    for k, v in pairs(tab) do        print(fun(k, v))    endendtab = { key1 = "val1", key2 = "val2" }-- 将匿名函数当成参数传入anonymous(tab, function(key, val)    return key .. " = " .. valend)

执行后果

$ lua function_test2.lua key1 = val1key2 = val2

thread(线程)

在 Lua 里,最次要的线程是协同程序(coroutine)。它跟线程(thread)差不多,领有本人独立的栈、局部变量和指令指针,能够跟其余协同程序共享全局变量和其余大部分货色。

线程跟协程的区别:线程能够同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

userdata(自定义类型)

userdata 是一种用户自定义数据,用于示意一种由应用程序或 C/C++ 语言库所创立的类型,能够将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

变量

变量在应用前,必须在代码中进行申明,即创立该变量。编译程序执行代码之前编译器须要晓得如何给语句变量开拓存储区,用于存储变量的值。

Lua 变量有三种类型:全局变量、局部变量、表中的域。

函数外的变量默认为全局变量,除非用 local 显示申明。函数内变量与函数的参数默认为局部变量。

局部变量的作用域为从申明地位开始到所在语句块完结(或者是直到下一个同名局部变量的申明)。

变量的默认值均为 nil。

循环

Lua认为false和nil为假,true 和非nil为真。要留神的是Lua中 0 为 true

while循环

while(condition)do   statementsend

for循环

Lua 编程语言中 for语句有两大类::

  • 数值for循环
  • 泛型for循环

数值for循环

for var=exp1,exp2,exp3 do      <执行体>  end  

var从exp1变动到exp2,每次变动以exp3为步长递增var,并执行一次"执行体"。exp3是可选的,如果不指定,默认为1。

for i=10,1,-1 do    print(i)end

for的三个表达式在循环开始前一次性求值,当前不再进行求值。

泛型for循环

泛型for循环通过一个迭代器函数来遍历所有值,相似java中的foreach语句

--打印数组a的所有值  for i,v in ipairs(a)     do print(v) end  

i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。

Lua repeat...until循环

Lua 编程语言中 repeat...until 循环语句不同于 for 和 while循环,for 和 while循环d的条件语句在以后循环执行开始时判断,而 repeat...until 循环的条件语句在以后循环完结后判断。

repeat   statementsuntil( condition )

repeat...until 是条件后行,所以repeat...until 的循环体外面至多要运行一次。

函数

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

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)   function_body return result_params_comma_separatedend
  • optional_function_scope
    该参数是可选的制订函数是全局函数还是部分函数,未设置该参数开端为全局函数,如果你须要设置函数为部分函数须要应用关键字local
  • function_name:
    指定函数名称。
  • argument1, argument2, argument3..., argumentn:
    函数参数,多个参数以逗号隔开,函数也能够不带参数。
  • function_body:
    函数体,函数中须要执行的代码语句块。
  • result_params_comma_separated:
    函数返回值,Lua语言函数能够返回多个值,每个值以逗号隔开。

Lua函数能够返回多个后果,其返回匹配串"开始和完结的下标"(如果不存在匹配串返回nil)

可变参数

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/#argendprint("平均值为",average(10,5,3,4,5,6))

执行后果:

总共传入 6 个数平均值为 5.5

运算符

Lua提供了以下几种运算符类型:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 其余运算符

算术运算符

下表列出了 Lua 语言中的罕用算术运算符,设定 A 的值为10,B 的值为 20:

操作符形容实例
+加法A + B 输入后果 30
-减法A - B 输入后果 -10
*乘法A * B 输入后果 200
/除法B / A w输入后果 2
%取余B % A 输入后果 0
^乘幂A^2 输入后果 100
-负号-A 输入后果v -10

关系运算符

下表列出了 Lua 语言中的罕用关系运算符,设定 A 的值为10,B 的值为 20:

操作符形容实例
==等于,检测两个值是否相等,相等返回 true,否则返回 false(A == B) 为 false。
~=不等于,检测两个值是否相等,相等返回 false,否则返回 true<(A ~= B) 为 true。
>大于,如果右边的值大于左边的值,返回 true,否则返回 false(A > B) 为 false。
<小于,如果右边的值大于左边的值,返回 false,否则返回 true(A < B) 为 true。
>=大于等于,如果右边的值大于等于左边的值,返回 true,否则返回 false(A >= B) is not true.
<=小于等于, 如果右边的值小于等于左边的值,返回 true,否则返回 false(A <= B) is true.

逻辑运算符

下表列出了 Lua 语言中的罕用逻辑运算符,设定 A 的值为 true,B 的值为 false:

操作符形容实例
and逻辑与操作符。 如果两边的操作都为 true 则条件为 true。(A and B) 为 false。
or逻辑或操作符。 如果两边的操作任一一个为 true 则条件为 true。(A or B) 为 true。
not逻辑非操作符。与逻辑运算后果相同,如果条件为 true,逻辑非为 false。not(A and B) 为 true。

其余运算符

下表列出了 Lua 语言中的连贯运算符与计算表或字符串长度的运算符:

操作符形容实例
..连贯两个字符串a..b ,其中 a 为 "Hello " , b 为 "World", 输入后果为 "Hello World"。
#一元运算符,返回字符串或表的长度。#"Hello" 返回 5

字符串

Lua 语言中字符串能够应用以下三种形式来示意:

  • 单引号间的一串字符。
  • 双引号间的一串字符。
  • [[和]]间的一串字符。

转义字符

转义字符意义ASCII码值(十进制)
\a响铃(BEL)007
\b退格(BS) ,将以后地位移到前一列008
\f换页(FF),将以后地位移到下页结尾012
\n换行(LF) ,将以后地位移到下一行结尾010
\r回车(CR) ,将以后地位移到本行结尾013
\t程度制表(HT) (跳到下一个TAB地位)009
\v垂直制表(VT)011
\代表一个反斜线字符''\'092
\'代表一个单引号(撇号)字符039
\"代表一个双引号字符034
空字符(NULL)000
\ddd1到3位八进制数所代表的任意字符三位八进制
\xhh1到2位十六进制所代表的任意字符二位十六进制

字符串操作

序号办法 & 用处
1string.upper(argument): 字符串全副转为大写字母。
2string.lower(argument): 字符串全副转为小写字母。
3string.gsub(mainString,findString,replaceString,num) 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(能够疏忽,则全副替换),如:> string.gsub("aaaa","a","z",3); zzza 3
4string.find (str, substr, [init, [end]]) 在一个指定的指标字符串中搜寻指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。> string.find("Hello Lua user", "Lua", 1) 7 9
5string.reverse(arg) 字符串反转> string.reverse("Lua") auL
6string.format(...) 返回一个相似printf的格式化字符串> string.format("the value is:%d",4) the value is:4
7string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连贯, byte 转换字符为整数值(能够指定某个字符,默认第一个字符)。> string.char(97,98,99,100) abcd string.byte("ABCD",4) 68 string.byte("ABCD") 65
8string.len(arg) 计算字符串长度。string.len("abc") 3
9string.rep(string, n)) 返回字符串string的n个拷贝> string.rep("abcd",2) abcdabcd
10.. 链接两个字符串> print("www.w3cschool"..".cn") www.w3cschool.cn