参考: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 的保留关键字。保留关键字不能作为常量或变量或其余用户自定义标示符:
and | break | do | else |
---|---|---|---|
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
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 | 示意执行的独立线程,用于执行协同程序 |
table | Lua 中的表(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 | |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 1到2位十六进制所代表的任意字符 | 二位十六进制 |
字符串操作
序号 | 办法 & 用处 |
---|---|
1 | string.upper(argument): 字符串全副转为大写字母。 |
2 | string.lower(argument): 字符串全副转为小写字母。 |
3 | string.gsub(mainString,findString,replaceString,num) 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(能够疏忽,则全副替换),如:> string.gsub("aaaa","a","z",3); zzza 3 |
4 | string.find (str, substr, [init, [end]]) 在一个指定的指标字符串中搜寻指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。> string.find("Hello Lua user", "Lua", 1) 7 9 |
5 | string.reverse(arg) 字符串反转> string.reverse("Lua") auL |
6 | string.format(...) 返回一个相似printf的格式化字符串> string.format("the value is:%d",4) the value is:4 |
7 | string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连贯, byte 转换字符为整数值(能够指定某个字符,默认第一个字符)。> string.char(97,98,99,100) abcd string.byte("ABCD",4) 68 string.byte("ABCD") 65 |
8 | string.len(arg) 计算字符串长度。string.len("abc") 3 |
9 | string.rep(string, n)) 返回字符串string的n个拷贝> string.rep("abcd",2) abcdabcd |
10 | .. 链接两个字符串> print("www.w3cschool"..".cn") www.w3cschool.cn |