当前位置: 首页 > 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【safari】react在safari浏览器中,遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。如何解决
  • 压缩包方式windows安装mysql
  • ORBSLAM3 ORB_SLAM3 Ubuntu20.04 ROS Noetic 虚拟机镜像 下载
  • 【漏洞复现】Netgear WN604 downloadFile.php 信息泄露漏洞(CVE-2024-6646)
  • CCF-CSP认证考试 202406-2 矩阵重塑(其二) 100分题解
  • 如何查看jvm资源占用情况
  • JavaScript(11)——对象
  • SSD基本架构与工作原理
  • MongoDB教程(十一):MongoDB关系管理与文档关联
  • 加密传输及相关安全验证:
  • bash 笔记
  • Web开发:xmlns解析
  • SpringBoot:SpringBoot通过注解监测Controller接口
  • 使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题
  • 用PyTorch从零开始编写DeepSeek-V2
  • Apache的基本使用
  • gitlab-ci配置详解(一)
  • input的行数自动增减
  • isset在php5.6-和php7.0+的一些差异
  • underscore源码剖析之整体架构
  • vue的全局变量和全局拦截请求器
  • Vue学习第二天
  • 爱情 北京女病人
  • 代理模式
  • 看域名解析域名安全对SEO的影响
  • 携程小程序初体验
  • 因为阿里,他们成了“杭漂”
  • 字符串匹配基础上
  • 如何正确理解,内页权重高于首页?
  • 昨天1024程序员节,我故意写了个死循环~
  • ​补​充​经​纬​恒​润​一​面​
  • ​业务双活的数据切换思路设计(下)
  • #APPINVENTOR学习记录
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (C++17) std算法之执行策略 execution
  • (C++哈希表01)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (笔试题)合法字符串
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (论文阅读11/100)Fast R-CNN
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四)软件性能测试
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET NPOI导出Excel详解
  • .Net 高效开发之不可错过的实用工具
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET业务框架的构建
  • @TableLogic注解说明,以及对增删改查的影响