全栈工程师开发手册 (作者:栾鹏)
架构系列文章


lua编译器安装

sudo apt install lua5.3

IDE安装\汉化

编辑器推荐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

Intellij Idea设置

首先需要配置Lua的SDK路径(上文的Lua环境) , 文件-项目架构-sdks,找到sdk的位置
在这里插入图片描述

脚本式编程

我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,如我们将如下代码存储在名为 hello.lua 的脚本文件中:

$ lua hello.lua

注释

单行注释
两个减号是单行注释:

--
多行注释
--[[
 多行注释
 多行注释
 --]]

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 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。
  1. nil 作比较时应该加上双引号 ":
> type(X)==nil
false
> type(X)=="nil"
true

因为type(X)返回值是字符串
  1. boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都为"真":

  2. string(字符串)字符串由一对双引号或单引号来表示。也可以用 2 个方括号 “[[]]” 来表示"一块"字符串。

变量

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

对 table 的索引使用方括号 []。Lua 也提供了 . 操作。

for循环

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(表)

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 "<模块名>"
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐