Lua 语法学习笔记

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

字符串类型,比较特别的是,字符串的连接不是使用+号,而是使用"...",使用+,字符串会被隐式的转化为数字(如果字符串不是数字将会报错)

lua 复制代码
str = 'hua'..'kai'
--输出"huakai"
print(str) 

--输出3,字符串会被隐式的转化为数字
print("1"+2)

table

一个比较强大的数据结构,类似一个数据,但它的索引值,不仅仅是数字(索引值从1开启),也可以是一个字符串,这使得它像一个map

lua 复制代码
-- 作为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索引值为字符串时,支持类型属性的访问使用"."

lua 复制代码
local table1 = {key1="value1",key2="value2"}
print(table1["key1"]) -- value1
print(table1.key1) --value1
table库函数
  1. table.insert:插入元素。

    复制代码
    local t = {1, 2, 3}
    table.insert(t, 4)
    print(t[4])  -- 输出: 4
  2. table.remove:移除元素。

    复制代码
    table.remove(t, 2)
    print(t[2])  -- 输出: 3
  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声明,默认都是全局变量哪怕它在局部代码块中

赋值

支持多个变量同时赋值

lua 复制代码
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;)
lua 复制代码
--- 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接受

lua 复制代码
local coordinates = {getCoordinates()}
print(coordinates[1], coordinates[2])  -- 输出: 10  20
local x,y = getCoordinates()
print(x,y)  -- 输出: 10  20

字符串

除了可以使用单引号、双引号表达字符串意外,还可以使用[[]]

lua 复制代码
local str = [[
孤独的人和欢乐的人zuo一块
孤独的人只会觉得更孤独
]]

print(str)

计算长度

在 Lua 中,要计算字符串的长度(即字符串中字符的个数),你可以使用 string.len 函数或 utf8.len 函数,包含中文的一般用 utf8.lenstring.len 函数用于计算只包含 ASCII 字符串的长度。

注意,uf8在5.3版本后才内置

lua 复制代码
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 不保证迭代顺序,迭代顺序是非确定性的。

模块

定义模块
lua 复制代码
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可以省略,但是为了体现该文件的是为了作为一个可能被外部引用的模块可以保留

引入模块
lua 复制代码
-- 存在于自定义的路径
require("hello")

require("test2.common")
-- 引入后赋值给一个变量,可以更清晰的定义引用的模块
local common = require("test2.common")


print(module.var1)
print(module.public_function())

--print(common.public_function())

--print(package.path)
  1. 使用**require("包含路径的文件名")**可以引用定义好的模块
  2. 在环境变量LUA_PATH,中可以定义自定义的加载路径(多个使用;分割)
    1. C:\Users\huakai\Desktop?.lua;;,前面的就是自定义的加载路径,;;表示新加的路径后面加上原来的默认路径
  3. 使用package.path可以输出当前加载的所有路径

面向对象

元表&__index
  1. 元表(metatable): 元表是一个普通的 Lua 表,可以附加到另一个表上。通过设置元表,可以改变该表的一些默认行为。
  2. __index 字段__index 是元表中的一个字段,用于定义当在表中访问不存在的键时该如何处理。__index 可以是一个表或一个函数。
    • 如果 __index 是一个表,那么 Lua 会在这个表中查找键。
    • 如果 __index 是一个函数,那么 Lua 会调用这个函数,将原表和键作为参数传递给它。
面向对象示例
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
相关推荐
什么都想学的阿超2 天前
【Redis系列 03】掌握Redis编程艺术:事务、管道与Lua脚本完全指南
redis·junit·lua
爱瑞瑞7 天前
Junit5测试类编写笔记
junit
黄暄7 天前
分布式锁优化:使用Lua脚本保证释放锁的原子性问题
java·redis·分布式·后端·junit·lua
cxh_陈9 天前
org.junit.runners.model.InvalidTestClassError:此类问题的解决
java·开发语言·junit
.生产的驴12 天前
SpringBoot 执行Lua脚本 服务端执行 减少性能损耗 优化性能 优化连接性能
java·数据库·spring boot·后端·junit·maven·lua
小小数媒成员12 天前
Unity—lua基础语法
unity·junit·lua
奋斗的老史13 天前
利用Lua脚本限制用户的访问频率
开发语言·junit·lua
渡梦酒13 天前
Redis批量删除Key的三种方式
数据库·redis·junit
兰德里的折磨55014 天前
为什么要使用stream流
java·jvm·spring boot·spring·junit·log4j·intellij-idea
i1yo_kiki14 天前
junit单元测试
junit·log4j