参考:https://www.w3cschool.cn/lua/…
Lua 装置
装置环境:cento7
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make 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 的创立是通过 ” 结构表达式 ” 来实现,最简略结构表达式是{},用来创立一个空表。也能够在表里增加一些数据,间接初始化表:
-- 创立一个空的 table
local 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)
>> end
aKey : aVlue
不同于其余语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引个别以 1 开始。
function(函数)
编辑一个 luaFunction.lua 文件,输出以下内容
function factorial1(n)
if n == 0 then
return 1
else
return n * factorial1(n - 1)
end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))
执行
lua luaFunction.lua
120
120
function 能够以匿名函数(anonymous function)的形式通过参数传递
-- function_test2.lua 脚本文件
function anonymous(tab, fun)
for k, v in pairs(tab) do
print(fun(k, v))
end
end
tab = {key1 = "val1", key2 = "val2"}
-- 将匿名函数当成参数传入
anonymous(tab, function(key, val)
return key .. "=" .. val
end)
执行后果
$ lua function_test2.lua
key1 = val1
key2 = 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
statements
end
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
statements
until(condition)
repeat…until 是条件后行, 所以 repeat…until 的循环体外面至多要运行一次。
函数
Lua 编程语言函数定义格局如下:
optional_function_scope function function_name(argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
- 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/#arg
end
print("平均值为",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 |