Lua 语言笔记(一)

news2025/1/12 0:01:55

1. 变量命名规范

弱类型语言(动态类型语言),定义变量的时候,不需要类型修饰
而且,变量类型可以随时改变

每行代码结束的时候,要不要分号都可以

变量名 由数字,字母下划线组成,不能以数字开头,也不能是保留字,而且不可以使用特殊字符
变量名区分大小写,避免创建下划线开头加大写字母组成的变量名

2. 变量类型

变量分为三种类型,全局变量,局部变量,表字段
默认创建的都是全局变量,局部变量用 local 修饰

3. 保留字

 4. 文档注释

-- [[

多行注释

]]

-- 单行注释

5. 基本数据类型

Lua 中有八种基本类型: nil、boolean、number、 string、function、userdata、 thread和table,库函数type返回一个描述给定值类型的字符串 type (v)返回其唯一参数的类型,编码为字符串

(1)nil ,在lua 中,只有false 和 nil 才表示假 0和空串表示真

(2)boolean 布尔类型

(3)string 字符串

str1="abcd";
str2=string.upper(str1);--转大写
print(str2);
print(string.lower(str2));--转小写

print(string.len(str1));--字符串长度
print(string.len("你好 lua"));--

print(string.reverse(str1));--反转

str3=789;
print("abc".."xyz"..str1..str2..123 ..456.56 ..str3..000);---连接符,number 如果在连接符左边,后面要空格

print("");
str4="abcd1234";
print(string.sub(str4,3,5));--截取,后面参数是开始位置和结束位置,结束位置可省略不写
print(string.sub(str4,-4,-2));--负数是从右往左数

--string.find(s, pattern, init, plain)  在字符串s中 查找pattern(可以是表达式),如果找到,则返回pattern 第一次出现的开始位置和结束位置,如果没找到,返回nil


str1="abcd1234";
--print(string.find(str1,"cd"));
--print(string.find(str1,"cd",3));--从指定位置处开始查找
--print(string.find(str1,"cd",-6));--如果是负数,则是从字符串长度+该负数的位置开始找

--print(string.find(str1,"%d",6));--最后一个参数,默认就是false,开启正则匹配模式
--print(string.find(str1,"(%d%d%d%d)"));
--print(string.find(str1,"%d",6,true));--最后一个参数,true 是直接当子串处理

(4)function

function 在lua 中一个基本的数据类型,是第一类值
格式
function funcName()
    ...
    ...
end
传参或返回值,都很自由
function 可以作为参数被传递,也可以作为值被赋值给另一个变量

(5)number,包括整型和浮点型

(6)userdata ,自定义数据格式

(7)thread,协程

(8)table,表

表,不是指数据库中的表,而是一种数据类型,类似于map,用k-v的方式来表现,理论上来讲,除了nil,其它字符都可以作为k 值(索引值)

    格式

    类似于hash
    tableName={
        k=v,
    }

    类似于数组 -- 下标是从1开始
    tableName={v,v,v}

    可以用hash 格式和 array 格式混搭
    x={11,22,33};
    y={44,55,66};

    t1={
        {11,22,33},
        {44,55,66}
    };

--table.concat(list, sep, i, j)  将数组中的元素拼接成一个字符串
--table.remove(list, pos) 删除数组中元素,默认删除最后一个
--table.insert(list, pos, value) 向指定位置插入元素,默认插入到最后
--table.sort(list, comp) 数组排序,默认从小到大,可自定义排序规则
--table.move(a1, f, e, t, a2) 把数组a1中的元素往a2中拷贝
t1={"abc","DEF","xyz","123","456"};
print(table.concat(t1,"--"));
table.remove(t1,2);
print(table.concat(t1,"--"));

table.insert(t1,2,"123456");
print(table.concat(t1,"--"));

table.sort(t1);
print(table.concat(t1,"--"));

function func1(a,b)
    return a>b;
end
table.sort(t1,func1);
print(table.concat(t1,"--"));

print("\n");
t2={"a","b"};
table.move(t1,1,2,3,t2);--把t1 里面的元素拷贝到t2 中
print(table.concat(t1,"--"));
print(table.concat(t2,"--"));


    for 循环遍历
    for k,v in pairs(tableName) do
       print(k,v);
    end


    c++ 中  pairs 是对组


    循环嵌套
    for k,v in pairs(info3) do
        print(k,"===",v);
        if type(v)=="table" then
            for k2,v2 in pairs(v) do
                print("\t",k2,"===",v2);
            end
        end

    end

6.基本运算符

--[[

赋值=
    lua 中变量是弱类型,就是说变量名是没有类型的,其类型取决于所赋的值,并且,同一个变量,可以随时切换成不同的数据类型
    多重赋值
    a,b=b,a  值交换   类似于swap


算术运算符
    加+,减-,乘*,除/,取模%,指数(次方)^


关系运算符
    等于==, 不等于~=, 大于>, 小于<, 大于或等于>=, 小于或等于<=
    关系运算符的运算结果只能是true 或 false,且只能在相同类型的数据间运算(运算时不会做隐式类型转换)

对于对象型的数据(function,userdata,table),比较运算是比较其引用
    
逻辑运算符
        逻辑与 and, 逻辑或 or, 逻辑非 not
        &&, ||, !

        在lua 中,逻辑运算与其它语言的逻辑运算不是同一个意思,其运算结果返回值是参与运算的变量之一(not 除外,not 只返回true 或 false)
        其它语言的逻辑运算,返回值是0 或 1(false 或 ture),意思就是返回一个bool 值

在lua 中,只有 nil(null,NULL) 和 false 为假,其它都为真(包括空串或0值)

对于and 和 or,实行短路运算(又称短路规则,短路求值,就是说,当前面的表达式可以返回时,就直接返回,不管后面的表达式)

]]

info1={a='a',b='b'};
info2={a='a',b='b'};
info3=info1;

print(info1 == info2);--false 比较的是引用
print(info1 == info3);--true 比较的是引用

print(info1.a == info2.a);--true 比较的是值

print(info1.a);
info3.a='aaa';
print(info1.a);

a,b=1,2;
print(a and b);--如果a 为真,则返回b

a=nil;
print(a and b);--如果a 不为真,则返回a,不再往后运算(不管b是啥)
print("\n");

c,d=1,false;
print(c or d);--如果 c 为真,则返回c,不再往后运算(不管d 是啥)

c=nil;
print(c or d);--如果 c 不为真,则返回d

print("\n");
e,f=1,2;
--print(e not f); --错误写法
print(not e);--如果e为真,则返回假

f=false;
print(not f);--如果f 为假,则返回真

7.流程控制

(1)判断语句

    流程控制语句
        if 条件 then
            ...
        end

(2)循环语句

while 条件 do
        ...
end

repeat
        ...
until 条件;

while 和 repeat 的区别
   while 循环中,当条件不成立时,结束循环
   repeat 循环中,当条件成立时,结束循环

没有 continue

    break 只能跳出一重循环
    goto FLAG  语句 跳转到指定标记处,也可用于跳出循环,FLAG是一个标记位,相当于一个锚点

    两者区别是
        break 只能跳出当前循环,而goto 可以跳转到指定位置,这样可以忽略一些代码

    在lua 中,没有这些运算符 i++, i--, ++i, --i, +=, -=

    a=b=1 这种写法会出错,不能连续赋值
--求和 1+2+3+...100    5050

i,sum=0,0;

while i<100 do

    if i>49 then
        goto FLAG;
        --break;
    end

    i=i+1;
    sum=sum+i;

end



print(i,sum);

print("111111");

::FLAG::
print("222");


i,sum=0,0;
repeat
    i=i+1;
    sum=sum+i;
until i>=100;

print(i,sum);


for 循环分为数值循环和泛型循环(类似于foreach)

    数值循环
    for 变量名=初始值,结束值,步长(默认值为1,可省略) do
        ...
    end


    泛型循环
    for k,v in 迭代函数(table) do   -- 此处 v 可以省略,k 不能少
        ...
    end


    迭代函数 ipairs,pairs

    ipairs 顺序遍历,中间的序号不会断开,遇到k=>v 直接跳过,遇到第一个nil 就会直接终止,一般情况下,用于数组类型的集合遍历
    pairs 遇到nil 会跳过,同时适用数组类型和k=>v 类型的集合,混搭也是没问题的,如果是混搭的时候,会优选获取数组类型数据

    pairs 的适用范围大于 ipars
    如果使用时不确定用哪个,就无脑pairs

(3)goto语句


--[[
    流程控制语句

    goto FLAG  语句 跳转到指定标记处,也可用于跳出循环,FLAG是一个标记位,相当于一个锚点

    代码块(作用域)  do ... end

    flag 不可见原则
    1 不能从外面 goto 到代码块里面,因为代码块里面的flag,对于外面的 goto来说,是不可见的
    2 不能跳出或跳入一个函数,因为函数也是一个block(块)
    3 不能跳入本地变量(local)作用域


]]--


do

    a=123;
    ::FLAG1::;
    print(a);
    ::FLAG2::;
    goto FLAG1;--此处goto 是在 local b 的作用域外面,所以报错

    local b=456;

    ::FLAG3::;
    print(b);
    --goto FLAG1;--此处goto 是在 local b 的作用域里面

end

--print(a);
--print(b);



--[[
function func1()

    ::FLAG1::;
    print("func1--11");
    print("func1--22");
    goto FLAG3;
    ::FLAG2::;

    print("func1--33");
    ::FLAG3::;

end

::FLAG4::;
print("aaaa");
func1();

::FLAG5::;

print("bbb");

]]--



--[[
print("1234");
goto FLAG1;

do
    print("a");
    print("b");

    ::FLAG1::;

    print("c");
    print("d");

    ::FLAG2::;

end

::FLAG3::;

print("aa");
print("bb");

::FLAG4::;

print("cc");
print("dd");

]]--

--死循环
--[[
i=0;
::FLAG1::;

    print(i);
    i=i+1;

goto FLAG1;
]]--


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS:filter滤镜 详解(用法 + 代码 + 例子 + 效果)

文章目录 filter 滤镜blur() 模糊度例子 渐变光晕 brightness() 元素亮度contrast() 对比度grayscale() 元素灰度hue-rorate() 色相opacity() 透明度invert() 反转颜色saturate() 饱和度 backdrop-filter 蒙版&#xff0c;滤镜例子 卷轴展开 filter 滤镜 动图为效果添加前后对…

计算复杂度基础

1. 抽象问题 抽象问题包括决策问题和优化问题 注意&#xff1a;描述中&#xff0c;I的缩写是Instance&#xff0c;S的缩写是Solution。 2. 决策问题 3. 优化问题 将一个优化问题转换为决策问题后&#xff0c;不会变的更难。 \color {green}将一个优化问题转换为决策问题后&…

实验篇——多序列比对,构树

实验篇——多序列比对&#xff0c;构树 文章目录 前言一、名词解释二、实操1. 文件准备2. 多序列比对3. 对比对序列修剪4. 构建进化树5. 可视化进化树 总结 前言 系统发育树构建的软件大致有如下几种策略&#xff1a;从最简单的UPGMA法&#xff0c;到邻接法&#xff0c;最大简…

一文学会配置Fanuc控制柜端ROS2驱动

文章目录 前言一、RobotGuide是什么&#xff1f;二、实现步骤创建机器人工作单元导入程序TP程序Karel程序 构建程序配置控制柜配置机器人控制柜通讯配置可同时运行程序数量配置ROS_RELAY变量配置ROS_STATE变量设置启用标志 三、测试机器人状态反馈机器人命令接收整体运行测试 总…

新晋游资:华东大导弹音频读后感

昨天晚上听了新晋游资 华东大导弹的一个音频&#xff0c;感受还是颇多的&#xff0c;首先他是一个很谦虚&#xff0c;很善良的人&#xff0c;同样的评价我会给92科比老师。其实&#xff0c;他说的都是很实在的话&#xff0c;没有半点虚言&#xff0c;很想帮助大家利用超短线走出…

C++初阶语法——static类成员

前言&#xff1a;本文将介绍类和对象中的static类成员——静态成员函数&#xff0c;静态成员变量的使用方法和注意点。在某些场景下&#xff0c;静态成员很有意义。 目录 一.概念二.特性静态成员不存在对象中 三.静态成员变量在类外初始化四.静态成员函数 一.概念 声明为stati…

RDMA qp数量和RDMA性能

QP数量上升性能下降 ​​​​​​https://icnp21.cs.ucr.edu/papers/icnp21camera-paper30.pdf 在现代云数据中心中&#xff0c;大规模分布式应用通常构建在许多机器上&#xff0c;需要使用大量并发连接进行频繁的网络通信[4]–[6]。但是&#xff0c;RDMA的性能会随着连接数的…

SpringBoot第42讲:SpringBoot集成Redis - 基于RedisTemplate+Lettuce数据操作

SpringBoot第42讲&#xff1a;SpringBoot集成Redis - 基于RedisTemplateLettuce数据操作 在SpringBoot 2.x版本中Redis默认客户端是Lettuce&#xff0c;本文是SpringBoot第42讲&#xff0c;主要介绍SpringBoot 和默认的 Lettuce 的整合案例。 文章目录 SpringBoot第42讲&#x…

通过案例学习pandas计算相关系数

pandas计算相关系数 在数据分析和统计学中&#xff0c;相关系数是一种用于衡量两个变量之间关系强度的统计指标。它可以帮助我们了解两个变量之间的线性关系强度和方向。 Pandas是一个强大的Python库&#xff0c;提供了许多用于数据分析和处理的功能。在本文中&#xff0c;我…

「新整理」战略定位理论发展史

1954年&#xff0c;彼得德鲁克——现代管理学之父 代表作《管理的实践》 提出具有划时代意义的概念——目标管理&#xff0c;将管理划分为战略管理、组织管理和自我管理。将生产力从生产部门扩大到组织的所有职能部门&#xff0c;以知识精英为代表的职业经理人开始代替资本家走…

基于ssm的CRM客户管理系统(spring + springMVC + mybatis)营销业务信息java jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于ssm的CRM客户管理系统&#xff08;spring spring…

java-JVM 类加载机制

JVM 类加载机制 JVM 类加载机制分为五个部分&#xff1a;加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化&#xff0c;下面我们就分别来看一下这五个过程。 1.1. 加载 加载是类加载过程中的一个阶段&#xff0c;这个阶段会在内存中生成一个代表这…

浏览器控制台调试实用方法

许多程序员仅知道控制台的console.log&#xff0c;其实控制台API还包含一些其他实用方法&#xff0c; 这些方法在前端调试时会很有帮助。 目录 console.dir 查看对象属性和方法 输出DOM元素 console.error console.time和console.timeEnd console.log console.clear 总结…

13---内嵌HTML和React

虽然Markdown本身不支持内嵌HTML和React&#xff0c;但可以在Markdown文档中直接插入HTML代码和React组件。 一、在markdown中内嵌HTML 在Markdown中&#xff0c;你可以使用HTML标签来实现更复杂的样式和布局。例如&#xff0c;你可以使用<div>标签来创建一个容器&#…

【Axure模板】APP帮助中心原型,在线客服意见反馈模块高保真原型

作品概况 页面数量&#xff1a;共 10 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;原型设计模板 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 该模板作品为APP帮助与客服的通用模块&#xff0c;…

Kepware 读取16位或32位数据时,结果不是真实数据的问题解决

kepware采集PLC的数据“IW260” IW260的值为61696&#xff0c;与PLC中显示的数值不一致。 61696二进制表示“11110001 00000000”,低8位“00000000”变为十进制为0&#xff1b;高8位“11110001”变为十进制为241&#xff0c;而241是IW260在PLC中显示的数值。由此可看出&#x…

【C语言】字符串函数介绍三(strstr、strtok、streeror)

前言 之前我们用两篇文章介绍了strlen、strcpy、stract、strcmp、strncpy、strncat、strncmp这些函数 第一篇文章strlen、strcpy、stract 第二篇文章strcmp、strncpy、strncat、strncmp 今天我们就来学习&#xff1a; 话不多说&#xff0c;我们直接开始 strstr 返回值 …

护航顶级赛事 | 以赛事空间信息服务助力大运会有序运行

8月8日&#xff0c;第31届世界大学生夏季运动会在成都圆满闭幕。此前&#xff0c;赛事组委会与相关部门着力建设“综合运行管理中心系统(后简称“MOC”系统)”&#xff0c;利用信息化手段&#xff0c;实现了对赛前、赛中、赛后各个阶段、各个对象、各个服务的信息化监管&#x…

用讯飞星火认知大模型构建一个带界面的聊天机器人

在本篇博客中&#xff0c;我们将使用 最新的星火认知大模型和 Tkinter 构建一个简单的聊天机器人界面。通过这个界面&#xff0c;用户可以与聊天机器人进行交互&#xff0c;并查看机器人的回答。 C:\pythoncode\blog\static_16919367030710594_SparkApi_Python\testui.py 准备…

Kubernetes二进制部署方案

目录 一、环境准备 2.1、主机配置 2.2、安装 Docker 2.3、生成通信加密证书 2.3.1、生成 CA 证书&#xff08;所有主机操作&#xff09; 2.3.2、生成 Server 证书&#xff08;所有主机&#xff09; 2.3.3、生成 admin 证书(所有主机) 2.3.4、生成 proxy 证书 三、部署 …