全栈工程师开发手册 (作者:栾鹏)
架构系列文章
sudo apt install lua5.3
编辑器推荐ides, linux系统下ides下载地址:https://www.jetbrains.com/idea/download/#section=linux 我这里下载的Community版本
下载后运行bin/ides.sh
汉化包,下载https://github.com/pingfangx/jetbrains-in-chinese/tree/master/IntelliJIDEA
我下载的resources_zh_CN_IntelliJIDEA_2018.3_r1.jar 直接将包放在软件的lib目录下,重启软件即可.
下载lua的插件,下载:https://plugins.jetbrains.com/plugin/5055-lua
打开软件在文件-设置-插件-在硬盘安装插件-选择下载下来的压缩文件-重启软件即可.
配置sdk
首先需要配置Lua的SDK路径(上文的Lua环境) , 文件-项目架构-sdks,找到sdk的位置
我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,如我们将如下代码存储在名为 hello.lua 的脚本文件中:
$ lua hello.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(X)==nil
false
> type(X)=="nil"
true
因为type(X)返回值是字符串
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都为"真":
string(字符串)字符串由一对双引号或单引号来表示。也可以用 2 个方括号 “[[]]” 来表示"一块"字符串。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
对 table 的索引使用方括号 []。Lua 也提供了 . 操作。
for i=10,1,-1 do
print(i)
end
if(1)
then
print("1 为 true")
elseif(1)
print('aaa')
else
print("0 为 false")
end
可变参数
function add(...)
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
end
select('#', …) 返回可变参数的长度
select(n, …) 用于访问 n 到 select('#',…) 的参数
关系运算符
~= 不等于,检测两个值是否相等,相等返回 false,否则返回 true
逻辑运算符
and or not
其他运算符
操作符 | 描述 | 实例 |
---|---|---|
… | 连接两个字符串 a…b , | 其中 a 为 "Hello " , b 为 “World”, 输出结果为 “Hello World”。 |
# | 一元运算符,返回字符串或表的长度。 | #“Hello” 返回 5 |
string.upper(argument):
字符串全部转为大写字母。
string.lower(argument):
字符串全部转为小写字母。
string.gsub(mainString,findString,replaceString,num)
在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:
string.find (str, substr, [init, [end]])
在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。
string.reverse(arg)
字符串反转
string.format(...)
返回一个类似printf的格式化字符串
string.char(arg) 和 string.byte(arg[,int])
char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。
string.len(arg)
计算字符串长度。
string.rep(string, n)
返回字符串string的n个拷贝
..
链接两个字符串
string.gmatch(str, pattern)
回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。
string.match(str, pattern, init)
string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。
一维数组
array = {"Lua", "Tutorial"}
for i= 0, 2 do
print(array[i])
end
多维数组
array = {}
for i=1,3 do
array[i] = {}
for j=1,3 do
array[i][j] = i*j
end
end
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。
-- 初始化表
mytable = {}
-- 指定值
mytable[1]= "Lua"
mytable["wow"] = "aaaa"
-- 移除引用
mytable = nil
table.concat (table [, sep [, start [, end]]]):
concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。
table.insert (table, [pos,] value):
在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.
table.maxn (table)
指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现)
table.remove (table [, pos])
返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。
table.sort (table [, comp])
对给定的table进行升序排序。
Lua 的模块是由变量、函数等已知元素组成的 table
-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end
local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
return module
require 函数
Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。例如:
require("<模块名>")
或者
require "<模块名>"