lua学习(一)
版本:5.3
官方文档:lua在线文档
在线编辑器:luaos在线模拟
介绍
Lua 是一种轻量级、可扩展的脚本语言,设计目标是为了嵌入到其他应用程序中,以提供灵活的脚本功能。
特点
-
简洁易学的语法:Lua 的语法简洁明了,易于学习和掌握。它采用类似 C 语言的语法风格,但更加简洁和灵活。
-
高效的执行速度:Lua 是一种解释型语言,但它的执行速度非常快。这得益于其高效的虚拟机和优化的编译器。
-
可扩展性强:Lua 可以很容易地与其他语言进行集成,并且可以通过编写 C 或 C++ 扩展来增强其功能。
-
轻量级:Lua 占用的内存空间非常小,适合在资源受限的环境中使用。
-
跨平台性:Lua 可以在多种操作系统上运行,包括 Windows、Linux、macOS 等。
基础语法
变量
Lua 中的变量无需声明类型,可以直接赋值。变量名由字母、数字和下划线组成,但不能以数字开头。
lua
a = 10 // 不用声明类型
b = "Hello"
c = true
变量作用域:
lua的变量默认是全局,一处定义,所有模块都可以使用,所以需要严格使用local关键字来修饰,使其成为局部变量。
lua
a = 10 // 全局变量
local b = 10 // 局部变量
数据类型
-
number:包括整数和浮点数,所有数字都是双精度浮点数(它可以表示十进制的15或16位有效数字,其可以表示的数字的绝对值范围大约是:-1.79E+308 ~ +1.79E+308)
-
字符串string
-
表Table:一般用于表达数组和表,表内除了nil,可以存储其他几种不同的数据类型,可以同时存储不同类型
-
函数function
-
自定义类型userdata:分为完全用户数据(一块由 Lua 管理的内存对应的对象),轻量用户数据(指一个简单的 C 指针)。用户数据在 Lua 中除了赋值与相等性判断之外没有其他预定义的操作。
-
线程thread:与操作系统的线程无关,只是一个独立的执行序列,被用于实现协程 。
-
nil:无效值,如果一个变量没有声明就调用,则返回该类型
Table(重点)
-
可以用任意类型的值来作数组的索引,但这个值不能是 nil
-
当使用Table作为数组时,其下标是以1为起始
-
作为表使用时,其key值是字符串类型
lua
a = {}
-- 当使用Table作为数组,可以通过insert插入数据
table.insert(a, 1) -- 效果类似python的append
table.insert(a, 2)
table.insert(a, 2, 3) --效果是在下表2的位置插入3
print(a[1]) --访问下标1的数据,该用例打印1
-- Table作为表来使用时
b = {}
b["aaa"] = 1
-- 方式二
b = {
a=1,
b=2,
["insd"]=3
}
Table连接
lua
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
--连接后的字符串 bananaorangeapple
-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))
-- 连接后的字符串 banana, orange, apple
-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
--连接后的字符串 orange, apple
插入和删除
lua
fruits = {"banana","orange","apple"}
-- 在末尾插入
table.insert(fruits,"mango")
print("索引为 4 的元素为 ",fruits[4])
-- 索引为 4 的元素为 mango
-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print("索引为 2 的元素为 ",fruits[2])
--索引为 2 的元素为 grapes
print("最后一个元素为 ",fruits[5])
--最后一个元素为 mango
table.remove(fruits)
print("移除后最后一个元素为 ",fruits[5])
--移除后最后一个元素为 nil
元表Metatable
用来定制Table的行为,比如通过重写元方法__add,实现两个Table相加
元表常见用法
- 设置元表:
lua
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
常用元方法
lua
__index -- 通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
-- __index用例
other = { foo = 3 }
t = setmetatable({}, { __index = other })
print(t.foo)
print(t.bar)
-- 设置__index为function
mytable = setmetatable({key1 = "value1"}, {
__index = function(mytable, key)
if key == "key2" then
return "metatablevalue"
else
return nil
end
end
})
print(mytable.key1,mytable.key2)
设置的是函数时,执行的过程:
-
mytable 表赋值为 {key1 = "value1"}。
-
mytable 设置了元表,元方法为 __index。
-
在mytable表中查找 key1,如果找到,返回该元素,找不到则继续。
-
在mytable表中查找 key2,如果找到,返回 metatablevalue,找不到则继续。
-
判断元表有没有__index方法,如果__index方法是一个函数,则调用该函数。
-
元方法中查看是否传入 "key2" 键的参数(mytable.key2已设置),如果传入 "key2" 参数返回 "metatablevalue",否则返回 mytable 对应的键值。
lua
-- 自定义计算表中最大键值函数 table_maxn,即返回表最大键值
function table_maxn(t)
local mn = 0
for k, _ in pairs(t) do
if type(k) == "number" and k > mn then
mn = k
end
end
return mn
end
-- 两表相加操作
mytable = setmetatable({ 1, 2, 3 }, {
__add = function(mytable, newtable)
local max_key_mytable = table_maxn(mytable)
for i = 1, table_maxn(newtable) do
table.insert(mytable, max_key_mytable + i, newtable[i])
end
return mytable
end
})
secondtable = {4, 5, 6}
mytable = mytable + secondtable
for k, v in ipairs(mytable) do
print(k, v)
end
lua
-- 用来对表更新。当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
循环
for
数值循环
lua
for i = 起始值, 结束值, 间隔值 do
-- statements
end
for i = 0, 10, 2 do // 从0开始,每次间隔2,遍历到10结束
-- statements
end
for i = 0, 10 do
-- statements
end
间隔值为1的时候可以省略。
迭代循环
遍历表
lua
tb = {["a"] = "hello", ["b"] = 2}
for k,v in pairs(tb) do
print(k, v)
end