一. 安装Lua环境
下载 lua
http://joedf.ahkscript.org/LuaBuilds/

解压到适合的地方

然后添加环境变量
然后用 cmd检查下
lua -v

二. vscode作为编辑器
vscode为Lua脚本编辑工具,仅仅具有脚本代码编辑功能,没有编译功能;
Lua为解释性语言,在Luat开发方式下,开发调试过程如下:
1、使用vscode编写Lua脚本
2、使用Luatools烧录Lua脚本
3、使用Luatools输出脚本运行日志
安装Lua插件

安装Luat插件

安装code runner

或者安装 lua debug

三. 基本操作
Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。
Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用
我们可以将 Lua 程序代码保存到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程
1. 注释
单行注释 : --
多行注释 : --[[内容]]
2. 换行符
Lua的多条语句之间并不强制要求任何分隔符,如C语言的分号(;),其中换行符也同样不能起到语句分隔的作用。
a = 1
b = a * 2
a = 1;
b = a * 2;
a = 1; b = a * 2;
a = 1 b = a * 2
3. nil 无效值
nil类型表示没有任何有效值,只要是没有声明的值,它就是nil
比如打印一个没有声明的值,便会输出nil
4.打印
print("hello world")
也可以用,
隔开打印多个值
a = 1
b = "2a"
print(a,b,c)

5. 单双引号及[[ ]]
单双引号规则和python基本相同.
即为: 单引号和双引号都可以, 单引号中可以包含双引号, 双引号中也可以包含单引号
print('我说:"hello world"')
print("我说:'hello world'")
但值得注意的是lua可以用[[
和]]
来表示字符串
6. 赋值
都是常规用法, 唯一的差别是Lua支持“多重赋值”。
n = 1
a, b = 10, 2*n
当左右值的数量不一致时,Lua会进行下面的设定:
变量个数 > 值的个数:按变量个数补足nil
变量个数 < 值的个数:多余的值会被忽略
7. 运算符
运算符 | 功能 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
// | 地板除 |
% | 取余,求出除法的余数 |
^ | 乘幂,计算次方 |
- | 负号,取负值 |
8. 真假值
Lua中所有的值都可以作为条件。在Lua中只有当值是false和nil时才视为“假”,其它值均视为真,如
数字零和空字符串是真值,这一点和C语言是不同的
。
四. 数据类型
Lua中的值有8种类型:nil、boolean、number、string、userdata、function、thread和table。
1.nil型
Lua中特殊的类型,他只有一个值:nil,它的主要功能是由于区别其他任何值。一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。Lua将nil用于表示一种“无效值”的情况。
2. boolean型
false和true。
3. number型
表示实数。由于资源所限,如需使用浮点型数据,请使用文件名带有float的固件。
4. string型
string和其他对象一样,Lua自动进行内存分配和释放,一个string可以只包含一个字母也可以包含一本 书,Lua可以高效的处理长字符串,1M的string在Lua中是很常见的。可以使用单引号或者双引号把一串字符括起来表示字符串
Lua中的字符串是恒定不变的。String.sub函数以及Lua中其他的字符串操作函数都不会改变字符串的值,而是返回一个新的字符串。
5.table型
table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:数组、矩阵、链表、队列等,Lua都是通过table来很好地实现。
Lua中table的键(key)可以为任意类型(nil除外)。当通过整数下标访问table中元素时,即是数组。此外,table没有固定的大小,可以动态的添加任意数量的元素到一个table中
6. function型
函数是第一类值,意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。这个特性给了语言很大的灵活性
7. userdata型
userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外没有预定义的操作, userdata用来描述应用程序或者使用C实现的库创建的新类型。
五. 变量和值
- Lua是动态类型语言,声明变量的时候不要类型定义。
- type函数获得变量的或值的类型信息
- Lua变量分为: 全局变量、局部变量、表中的域。
- Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
1. 全局变量
- 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量
- 访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil
- 如果你想删除一个全局变量,只需要将变量赋值为nil
2. 局部变量
- 局部变量必须通过local 来声明。
六. 运算符
1. 算术运算符
要注意, lua 的除法是自然除法, 如果用地板除,需要使用//
2. 关系运算符
Lua支持的关系操作符有:>、<、>=、<=、==、~=(不等于)。
注意:
- ==和~=这两个操作符可以应用于两个任意类型的值。如果两个值的类型不同,Lua就认为他们不等。
- nil值与其自身相等。
- tables、userdata、functions是通过引用进行比较的。也就是说,只有当他们引用同一个对象时,才视为相等。
- Lua比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。
3. 逻辑运算符
共有3个: and or not
七. 逻辑控制
1. if语句
if 语句有3种结构:
if condition then
statements
end
if condition then
statements
else
statements
end
if condition1 then
statements
elseif condition2 then
statements
… -- 很多个elseif
statements
end
2. while语句
while condition do
statements
end
3. repeat...until 循环 //(相当于其他语言的do...while)
repeat
statements
until( condition )
4. for循环
数值for循环
for var=form,to,step do
<执行体>
end
step 是可选的,如果不指定,默认为1
泛型for循环
--打印数组a的所有值
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
end
5. break 语句
break 语句插入在循环体中,用于退出当前循环或语句,并开始脚本执行紧接着的语句。
如果你使用循环嵌套,break语句将停止最内层循环的执行,并开始执行的外层的循环语句。
6. goto 语句
Lua 语言中的 goto 语句允许将控制流程无条件地转到被标记的语句处。
goto Label
Label 的格式为:
:: Label ::
八. 函数
语法:
function test(arg1,arg2,...)
--...
end
- Lua函数支持返回多个结果值
function foo0 () end -- returns no results
function foo1 () return 'a' end -- returns 1 result
function foo2 () return 'a','b' end -- returns 2 results
当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
x,y = foo2() -- x='a', y='b'
x = foo2() -- x='a', 'b' is discarded
x,y,z = 10,foo2() -- x=10, y='a', z='b'
x,y = foo0() -- x=nil, y=nil
x,y = foo1() -- x='a', y=nil
x,y,z = foo2() -- x='a', y='b', z=nil
其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
x,y = foo2(), 20 -- x='a', y=20
x,y = foo0(), 20, 30 -- x='nil', y=20, 30 is discarded
print(foo2(), 1) --> a 1
print(foo2() .. "x") --> ax
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4
- Lua函数可以接受可变数目的参数,在函数形参中用三点(...)表示函数有可变的参数。Lua将函数的可变参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。
九. 模块与包
模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
1. 创建模块
Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。以下为创建自定义模块 module.lua,文件代码格式如下:
-- 文件名为 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
由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。
上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用.
2. 调用模块
Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。
require("模块名")
-- 或者
require "模块名"
-- 或者起别名
local m = require("module")
3. 加载机制 //系统如何找到模块???
对于自定义的模块,模块文件不是放在哪个文件目录都行,函数 require 有它自己的文件路径加载策略,它会尝试从 Lua 文件或 C 程序库中加载模块。
require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。
网友评论