🤔
Lua IDE
Mac端Lua IDE推荐使用Intellij+EmmyLua。这也是我使用过最好的Lua IDE
下载地址:IntelliJ IDEA
EmmyLua安装方法:Preferences ——>Plugins ——>搜索EmmyLua
在使用EmmyLua时出现bug,或对此插件有什么建议,可以加群:
29860775
进行反馈
Lua 数据类型
Lua是一种动态类型的语言。在语言中没有类型定义的语法,每个值都携带了它自身的类型信息。
在Lua中有8种基础类型,分别是nil、boolean、number、string、userdata、function、thread和table
名称 | 数据类型 | 描述 | 示例 |
---|---|---|---|
nil | 空类型 | 表示一个无效值 | a |
boolean | 布尔 | 包含两个值:false和true | a = true |
number | 数字 | 双精度类型的实浮点数 | a = 7 |
string | 字符串 | 由一对双引号或单引号来表示 | a = ‘yu’ |
userdata | 自定义类型 | 任意存储在变量中的C数据结构 | 标准i/o库 |
function | 函数 | 由 C 或 Lua 编写的函数 | 见下文 |
thread | 协程 | 表示执行的独立线路,用于执行协同程序 | |
table | 表 | Lua 中的表其实是一个”关联数组” | a = {} |
字符串
- Lua中的字符串通常表示“一个字符序列”。
- Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0。 也就是说,可以将任意二进制数据存储到一个字符串中。
- Lua的字符串是不可变的值。
- Lua的字符串和其他Lua对象一样,都是自动内存管理机制所管理的对象
- Lua字符串可以用以下方式来表示:
s = 'Hello, World'
s = "Hello, World"
- Lua 提供了很多的方法来支持字符串的操作,可以查阅Lua 字符串来了解更多
变量
- Lua 变量有两种类型:全局变量、局部变量。
- Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声 明为局部变量。
- 局部变量的作用域为从声明位置开始到所在语句块结束。
- 变量的默认值均为 nil。
local i = 1 --局部变量
Lua 流程控制
- lua提供了一组传统的流程控制,if-else
- if语句先测试条件,然后根据结果执行then部分或else部分,其中else部分是可选的:
1
2
3
4
5
6
7
8
9a = 0
if a > 0 then
print('a > 0')
elseif a < 0 then
print('a< 0')
else
print('a = 0')
end
Lua 循环
- Lua 语言提供了以下几种循环:
- while
- for
- repeat…until
- 同时Lua 支持 break语句
while
- 与其他语言一样,Lua中的while循环先测试条件,如果条件为真,就执行循环体,否则结束循环:
1
2
3
4
5a = 0
while a < 10 do
print(a)
a = a + 1
end
repeat
- Lua中repeat-until语句会重复执行循环体至条件为真时结束:
1
2
3
4
5a = 0
repeat
print(a)
a = a + 1
until a > 10
for
- Lua的for循环有两种形式:
- 数字型for
- 泛型for
数字型:
1 | for i = 1, 10, 2 do |
含义为,i从1变化到10,每次变化以2作为步长递增并执行循环体。 其中步长是可选的,若不指定,则步长默认为1
泛型:
1 | days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} |
泛型for循环通过一个迭代器函数来遍历所有的值,在Lua中,提供了ipairs这个用于便利数组的迭代器函数。每次循环,i会被赋予一个索引值,v会被赋予一个对应该索引值的数组元素值。
泛型for循环的功能非常强大,可以通过不同的迭代器来遍历所有东西。如:
迭代文件中的每行(io.lines)、迭代table元素(pairs)、迭代数组元素(ipairs)、迭代字符串中的字符(string.gmatch)等。当然,还可以自己编写迭代器。
break
- break语句用于结束一个循环,它只会跳出包含它的内部循环,而不会改变外部循环。
例:1
2
3
4
5
6
7
8
9a = 0
while a < 10 do
a = a + 1
if a > 5 then
break
end
print(a)
end
function
- 在Lua中,函数作为“一等对象”。这表示函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。这种特性使语言具有极大的灵活性。
- Lua对函数式编程也提供了良好的支持。
- Lua既可以调用自身的Lua编写的函数,也可以调用c编写的函数。
- 函数的定义如下:
1
2
3
4
5function SumTowNum(num1 , num2)
return num1 + num2
end
print(SumTowNum(10, 11))
输出:
21
- Lua函数可以返回多个结果值,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13function maximum (a)
local mi = 1 -- 最大值索引
local m = a[mi] -- 最大值
for i,val in ipairs(a) do
if val > m then
mi = i
m = val
end
end
return m, mi
end
print(maximum({8,10,23,12,5}))
输出:
23 3
- Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 …表示函数有可变的参数。
table表
- Lua table 实现了关联数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
table是Lua中主要的(事实上也是仅有的)数据结构机制,具有强大的功能,基于table,可以以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列及其他数据结构。同时Lua也是通过table来表示模块、包和对象的
可以将table想象成一种动态分配的对象,程序仅持有一个对它的引用(或指针)。
table的创建是通过构造表达式完成的:
1
2
3
4--创建table
a = {}
b = 'x'
a.b = 10 -- key = 'x'. value = 10tabel永远是匿名的,一个持有table的变量和table自身之间没有固定的关联性。