Lua 语法学习笔记
安装(windows)
官网:https://www.lua.org/
下载SDK
解压&修改名称(去除版本号)
将lua后面的版本号去掉,如lua54.exe->lua.ext
配置环境变量
数据类型
数据类型 | 描述 |
---|---|
nil | 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 |
boolean | 包含两个值:false和true。 |
number | 表示双精度类型的实浮点数 |
string | 字符串由一对双引号或单引号来表示 |
function | 由 C 或 Lua 编写的函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
table | Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。 |
string
字符串类型,比较特别的是,字符串的连接不是使用+号,而是使用"…",使用+,字符串会被隐式的转化为数字(如果字符串不是数字将会报错)
str = 'hua'..'kai'
--输出"huakai"
print(str)
--输出3,字符串会被隐式的转化为数字
print("1"+2)
table
一个比较强大的数据结构,类似一个数据,但它的索引值,不仅仅是数字(索引值从1开启),也可以是一个字符串,这使得它像一个map
-- 作为map使用
local table1 = {key1="value1",key2="value2"}
for key,value in pairs(table1) do
print(key,value)
end
-- 输出
--key1 value1
--key2 value2
-- 作为数组使用
local table2 = {1,2,3}
for index,value in ipairs(table2) do
print(index,value)
end
索引访问
当table索引值为字符串时,支持类型属性的访问使用".
"
local table1 = {key1="value1",key2="value2"}
print(table1["key1"]) -- value1
print(table1.key1) --value1
table库函数
-
table.insert
:插入元素。local t = {1, 2, 3} table.insert(t, 4) print(t[4]) -- 输出: 4
-
table.remove
:移除元素。table.remove(t, 2) print(t[2]) -- 输出: 3
-
table.sort
:排序。local t = {5, 3, 2, 4, 1} table.sort(t) for i, v in ipairs(t) do print(v) -- 输出: 1 2 3 4 5 end
function
函数,类似js,可以作为一个变量
变量
分为全局变量和局部变量,如果不使用local
声明,默认都是全局变量哪怕它在局部代码块中
赋值
支持多个变量同时赋值
local a,b = 1,2
a,b = b,a
print(a,b) --2 a,b 变量交换
循环
Lua 语言提供了以下几种循环处理方式:
循环类型 | 描述 |
---|---|
while 循环 | 在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。 |
for 循环 | 重复执行指定语句,重复次数可在 for 语句中控制。 |
repeat…until | 重复执行循环,直到 指定的条件为真时为止 |
循环嵌套 | 可以在循环内嵌套一个或多个循环语句(while do … end;for … do … end;repeat … until;) |
--- while
local a = 3
while (a > 0) do
print(a)
a = a - 1
end
local b = 3
--- repeat 循环
repeat
print(b)
b = b - 1
until b <= 0
--- for 循环
for i = 1, 3 do
print(i)
end
--- for 循环,补仓为2
for i = 1, 3, 2 do
print(i)
end
函数
多返回值
支持返回多个值,可以使用多个变量接收,也可以使用一个table接受
local coordinates = {getCoordinates()}
print(coordinates[1], coordinates[2]) -- 输出: 10 20
local x,y = getCoordinates()
print(x,y) -- 输出: 10 20
字符串
除了可以使用单引号、双引号表达字符串意外,还可以使用[[]]
local str = [[
孤独的人和欢乐的人zuo一块
孤独的人只会觉得更孤独
]]
print(str)
计算长度
在 Lua 中,要计算字符串的长度(即字符串中字符的个数),你可以使用 string.len函数或 utf8.len 函数,包含中文的一般用 utf8.len,string.len 函数用于计算只包含 ASCII 字符串的长度。
注意,uf8在5.3版本后才内置
local str1 = 'huakai'
local str2 = 'huakai不识'
print(string.len(str1)) --- 6
print(string.len(str2)) --12 一个中文字符的使用三个字节相当于3倍的ASCII长度
print(utf8.len(str2)) ---8
迭代器
ipairs和pairs比较
ipairs
函数用于迭代一个table的数组部分(即索引为连续整数的部分)。迭代从索引1开始,直到遇到第一个nil
值为止。pairs
函数用于迭代一个table的所有键值对,无论这些键是整数还是其他类型(如字符串)。pairs
不保证迭代顺序,迭代顺序是非确定性的。
模块
定义模块
module = {}
module.var1 = 'huakai'
--- 这个方法无法被外部访问
local function private_function()
print('I‘m private function')
end
function module.public_function()
print('I’m public function')
end
return module
其中的return可以省略,但是为了体现该文件的是为了作为一个可能被外部引用的模块可以保留
引入模块
-- 存在于自定义的路径
require("hello")
require("test2.common")
-- 引入后赋值给一个变量,可以更清晰的定义引用的模块
local common = require("test2.common")
print(module.var1)
print(module.public_function())
--print(common.public_function())
--print(package.path)
- 使用**require(“包含路径的文件名”)**可以引用定义好的模块
- 在环境变量LUA_PATH,中可以定义自定义的加载路径(多个使用;分割)
- C:\Users\huakai\Desktop?.lua;;,前面的就是自定义的加载路径,;;表示新加的路径后面加上原来的默认路径
- 使用package.path可以输出当前加载的所有路径
面向对象
元表&__index
- 元表(metatable): 元表是一个普通的 Lua 表,可以附加到另一个表上。通过设置元表,可以改变该表的一些默认行为。
__index
字段:__index
是元表中的一个字段,用于定义当在表中访问不存在的键时该如何处理。__index
可以是一个表或一个函数。- 如果
__index
是一个表,那么 Lua 会在这个表中查找键。 - 如果
__index
是一个函数,那么 Lua 会调用这个函数,将原表和键作为参数传递给它。
- 如果
面向对象示例
Dog = {
name = '',
age = 0,
}
function Dog:new(name, age)
local dog = {}
setmetatable(dog, self) -- 将Dog设置为dog的元表
self.__index = self -- 将__index字段设置为self,使得dog可以访问Dog的字段和方法
dog.name = name
dog.age = age
return dog
end
function Dog:say()
print(self.name .. ' is wang wang')
end
function Dog:getAge()
return self.age
end
dog = Dog:new('huahua', 3)
dog:say() -- huahua is wang wang
print(dog:getAge()) -- 3