当前位置: 首页 > news >正文

Lua 语法学习笔记

Lua 语法学习笔记

安装(windows)

官网:https://www.lua.org/

下载SDK

image-20240721123802978

image-20240721123836142

image-20240721123906339

image-20240721123959065

解压&修改名称(去除版本号)

将lua后面的版本号去掉,如lua54.exe->lua.ext

image-20240721124100681

配置环境变量

image-20240721124218028

数据类型

数据类型描述
nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean包含两个值:false和true。
number表示双精度类型的实浮点数
string字符串由一对双引号或单引号来表示
function由 C 或 Lua 编写的函数
userdata表示任意存储在变量中的C数据结构
thread表示执行的独立线路,用于执行协同程序
tableLua 中的表(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) doprint(key,value)
end
-- 输出
--key1	value1
--key2	value2-- 作为数组使用
local table2 = {1,2,3}
for index,value in ipairs(table2) doprint(index,value)
end
索引访问

当table索引值为字符串时,支持类型属性的访问使用"."

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) doprint(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) doprint(a)a = a - 1
endlocal b = 3--- repeat 循环
repeatprint(b)b = b - 1
until b <= 0--- for 循环
for i = 1, 3 doprint(i)
end--- for 循环,补仓为2
for i = 1, 3, 2 doprint(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.lenstring.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')
endfunction module.public_function()print('I’m public function')
endreturn 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)
  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 会调用这个函数,将原表和键作为参数传递给它。
面向对象示例
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 = namedog.age = agereturn dog
endfunction Dog:say()print(self.name .. ' is wang wang')
endfunction Dog:getAge()return self.age
enddog = Dog:new('huahua', 3)dog:say() -- huahua is wang wang
print(dog:getAge()) -- 3
http://www.lryc.cn/news/406135.html

相关文章:

  • Prometheus配置alertmanager告警
  • .net core 外观者设计模式 实现,多种支付选择
  • Matlab 命令行窗口默认输出(异常)
  • LeetCode/NowCoder-二叉树OJ练习
  • PSINS工具箱函数介绍——insplot
  • Docker简单快速入门
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 图像物体的边界(200分) - 三语言AC题解(Python/Java/Cpp)
  • 【无人机】低空经济中5G RedCap芯片的技术分析报告
  • MongoDB教程(二十一):MongoDB大文件存储GridFS
  • vue 搜索框
  • 国科大作业考试资料-人工智能原理与算法-2024新编-第五次作业整理
  • C++五子棋(未做完,但能玩,而且还不错)
  • 二分查找代码详解
  • uniapp的h5,读取本地txt带标签的文件
  • 韦东山嵌入式linux系列-具体单板的按键驱动程序(查询方式)
  • 如何使用 API list 极狐GitLab 群组中的镜像仓库?
  • PHP设计模式-简单工厂模式
  • C语言航空售票系统
  • Oracle 19c打Datapatch数据补丁报错处理
  • Linux shell编程学习笔记66:ping命令 超详细的选项说明
  • SSL/TLS和SSL VPN
  • 浅谈WebSerice
  • linux快速入门-学习笔记
  • 科普文:5种Linux下软件部署方式说明
  • Redisson中的RBlockingQueue的使用场景及例子
  • 【办公软件】Office 2019以上版本PPT 做平滑切换
  • connect-multiparty中间件用法以及实例--文件上传中间件(保姆级别教学)
  • 0503触发器的电路结构和工作原理
  • LeetCode:二叉树的中序遍历(C语言)
  • MySQL数据库基本安装与部署