首页 > 其他分享 >Lua 基本语法

Lua 基本语法

时间:2022-11-28 13:14:06浏览次数:25  
标签:基本 function end -- 语法 Lua print false true

Lua是动态类型语言,变量不要类型定义。

数据类型

数据类型 描述
nil 空(在条件表达式中相当于false)
Boolean 布尔值:true / false
number 浮点数(Lua中整数浮点数不做区分)
string 字符串(Lua中字符字符串通用string)
function 由C或Lua编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线程,用于执行协同程序
table 表,关联数组,数组的索引可以是数字,字符串或表类型,在Lua中,table的创建是通过“构建表达式”来完成,最简单构造表达式是{},用来创建一个空表。

userdata 跟C语言挂钩。

thread 相当于Unity中的携程。

print("Hello World") 输出,末尾不用添加;,添加了也是不会错的。

给变量赋不同类型

-- 当前a的类型为number
a = 10;
-- 重新赋值a的类型为string
a = "小明"

算数运算符

下列列出Lua语言中的常用的算术运算符,假设A的值为10,B的值为20:

操作符 描述 实例
+ 加法 A+B输出结果30(若是加号两边不能转换成number类型则无法相加)
- 减法 A-B输出结果-10
* 乘法 A*B输出结果200
/ 除法 B/A输出结果2
% 取余 B%A输出结果0
^ 乘幂 A^2输出结果100
- 负号 -A输出结果-10

关系运算符

下列为Lua语言中的常用的关系运算符,设定A的值为10,B的值为20:

操作符 描述 实例
== 等于,检测两个值是否相等,相等返回true,否则返回false (A==B)为false
~= 不等于,检测两个值是否相等,不相等返回true,否则返回false (A~=B)为true
> 大于,如果左边的值大于右边的值,返回true,否则返回false (A>B)为false
< 小于,如果右边的值大于左边的值,返回true,否则返回false (A<B)为true
>= 大于等于,如果左边的值大于等于右边的值,返回true,否则返回false (A>=B)为false
<= 小于等于,如果左边的值小于等于右边的值,返回true,否则返回false (A<=B)为true

逻辑运算符

下列为Lua语言中的常用逻辑运算符,设定A的值为true,B的值为false

操作符 描述 实例
and and两边条件都为true,则返回true,否则返回false (A and B)为false
or or两边条件都为false,则返回false,否则返回true (A or B)为true
not 如果条件为true,逻辑非为false not(A and B)为true

if...else语句

ifelseif后面一定要加关键字then

a = 100

if a > 90 then
    print("A")
elseif a > 80 then
    print("B")
else    
    print("C")
end

注意:Lua中0为true,C#中0为false。

循环

while循环

a = 0
while a < 10 do 
    print(a)
    a = a + 1
end

数值for循环

for i = 1, 10, 1 do
    print("Hello World")
end

repeat...until

和C#中的do...while()类似,但do...while()是条件不符合跳出,repeat..until是符合条件跳出。

a = 0
repeat
    print(a);
    a = a + 1
until a > 10

C#和Lua用法区别

语言风格 OOP面向对象型语言 OP面向过程 function函数式编程
强语言 弱语言
基本数据类型 整数、浮点数、布尔、字符、字符串 number数字、booleam布尔、string字符串
空类型 null nil
定义类型 int a = 10;声明变量时需要定义类型 a = 10不需要定义类型
全局变量 static bool a = true;类型前需要添加static关键词 a = 10就是全局变量,local a = 10添加local就变成局部变量
数据交换 数据交换时需要定义中间量临时存储 a,b = 10,20 a,b = b,a 不需要定义中间量
运算符 + 数据相加,字符串连接 代表数字运算(加号左右两边必须是number类型或者可以转换成number类型,否则就会报错)
运算符 .. 没有 用于字符串的连接
运算符^ Math.power(基数,指数) 2^2
运算符+=、-=、*=、/=、%= 没有
运算符不等于 != ~=
逻辑运算符 `&&、
运算符# 没有 求字符串或表的长度(所占内存长度)
控制流程 `if...else if...else... if...then elseif...then else end
循环 for、do while、while for、while、repeat..until
函数方法 访问修饰符 返回值 方法名(参数定义){方法体} function 方法名(参数定义) 方法体 end

Lua方法类型

-- 没有返回值没有参数
function Do1()
    
end
-- 有参数没有返回值(因为Lua不需要定义数据类型,故可以传任何数值)
function Do2(a,b)
    
end
-- 有参数有返回值
function Do3(a,b)
    return a+b;
end
-- 多返回值
function Do4(a,b)
    return a+b, a-b, a*b, a/b
end
-- 可以使用多个参数进行承接
local a,b,c,d =Do4(1,2)

Lua方法传递

使用方法一:

function Do(a, b)
    return a + b
end
-- 方法也是可以传递
t = Do

print(t(2, 3))

使用方法二:

function Do(f)
    if f~=nil then
        f();
    end
end

-- 方法作为参数进行传递(匿名方法)
Do(function ()
    print("lll")
end)

可变参数

三个点表示可变参数

function Do(...)
    -- 使用局部变量接住可变参数
    local args = {...}
    -- select 传入可变参数的数量
    print(select("#",...))
    -- 从第二位开始输出后面的数值
    print(select(2,...))
    for key, value in pairs(args) do
        print(value);
    end
end
-- 方法执行
Do(1,3,5)

table 表

table是lua的一种数据结构,用来帮助我们创建不同的数据类型,如:数组,字典等。

可以使用任意的数值做数组的索引,但是不能为nil。

大小不是固定的,根据自己的需要进行扩容。

mytable = {}创建一个空表

pairs批量输出所有的数据(包含数组和字典)

ipairs只能遍历连续的数组结构部分,若数组第七位数据是没有数据的,那么遍历到第六位就会停止。

table数组长度动态扩容

table表中数组数据扩容是以2的倍数进行的。

若当前数组的容量是4的话,若向第5个位置添加元素数据,但若是前四个位置是有空位,便不会进行扩容,而是作为键值对进行存储,若是前四个位置都是有数据的,没有空位,数组将会扩容,数据将存储到数组的第五个格子的位置。

-- 初始化表中数据
local mytable = {"zhang_san", "li_si", "wang_wu",teacher = "xiao_zhao"}

-- 访问数组数据
print(mytable[1])
-- 访问键值对 
print(mytable["teacher"])
-- 访问键值对
print(mytable.teacher)

-- 数组添加
mytable[4] = "youyou"
-- 添加键值对
mytable.adivser = "kong_sha_sha"

-- 表中数据删除
mytable.teacher = nil

-- 获得数组长度(连续数组)
print(#mytable)

-- 遍历表中所有的数据(数组顺序输出,键值对无无序输出)
for key, value in pairs(mytable) do
    print(key..value);
end

-- 遍历数组结构部分
for index, value in ipairs(mytable) do
    print(value)
end

使用表来承接方法的多返回值

function Do(a, b)
    return a+b,a-b,a*b,a/b
end

-- 多返回值可以使用表来承接
local args = {Do(1, 2)}
for key, value in pairs(args) do
    print(key,value)
end

table的索引是从1开始的。

表中数据插入

local t = {"ping_guo", "xiang_jiao"}
-- 向表t中添加字符串 "ju_zi"
table.insert(t, "ju_zi")
-- 插入到表中指定位置,当前位置的元素向后移
table.insert(t, 1, "ming_meng")

表中指定数据删除

local t = {"ping_guo", "xiang_jiao"}
-- 移除表中最后一个元素
table.remove(t)
-- 根据索引删除表中数据
table.remove(t,1)

Lua模块

模块类类似一个封装库

定义一个mylib.lua脚本

-- 定义一个mylib的模块
mylib = {}

-- 这是模块中的一个变量
mylib.name = "llll"

-- 返回当前模块
return mylib

引用模块

-- 引入mylib模块,和C#中使用using类似
require("mylib")
-- 使用mylib中定义的数据
print(mylib.name)

:. self三者的区别

t = {money = 10000}

-- 静态方法
function t.Hua_Qian(t)
    t.money = t.money -100
end

-- 成员方法
function t:Hua_Qian()
    self.money = self.money -100
end

-- 静态方法调用
t.Hua_Qian(t)
-- 成员方法调用
t:Hua_Qian()

print(t.money)

.相当于静态方法,可以多个表共同使用一个

:相当于成员方法,只供本表进行使用

self和this相当,相当于是当前表

:使用频率较多。

闭包

当方法执行完毕后方法内存的变量没有销毁,就形成了闭包。

如:通过for循环动态创建点击按钮,并且在在创建的时候给按钮添加的事件或着数据,并不会随着方法执行完毕而销毁。

使用闭包实现ipairs迭代器

local t = {1,2,3,4}

local function mpairs()
    local index = 0
    return function ()
        index = index + 1
        return t[index]
    end
end

for value in mpairs() do
    print(value)
end

元表

元表是允许针对当前表的行为进行修改,具体改什么依赖元表中的元方法

通过表实现两个vector3相加

v = {x = 1,y = 2,z = 3}
p = {x = 4,y = 5,z = 6}

-- 给其中一个表添加元表(两个表相加,改变其中一个表即可)
setmetatable(v,{
    __add = function (a,b)
       local q = {}
       q.x = a.x + b.x
       q.y = a.y + b.y
       q.z = a.z + b.z
       return q 
    end
})

local g = v + p
print(g.x,g.y,g.z)

__index 最常用的元方法

若果是方法的话,先找原始表中是否有这个键,元方法有这个键就返回这个键对应的值,这个键不存在就找对应的元方法__index,如果元方法是一个方法,调用这个方法,返回这个方法的返回值,如果不是方法是一个表的话,返回另一个表中去查。

local t = {name = "gg"}
local v = {age = 10}

setmetatable(t,{
    __index = v
})

print(t.age)

标签:基本,function,end,--,语法,Lua,print,false,true
From: https://www.cnblogs.com/wuzhongke/p/16931911.html

相关文章

  • day33- js基础语法
    字符串正常字符串使用单双引号包裹转义字符\'\n\t\u4e2d(\u####)unicode字符Ascll字符多行字符串``tab键上面的``包含多行字符模板字符串需要使......
  • JaCoCo增量覆盖率的基本实现原理
    什么是增量覆盖率如图所示,在master分支提交了HelloController,然后从master拉了个新分支test;提交了第1次代码,增加了WorldController;提交了第2次代码,增加了DonController。增......
  • MarkDown语法学习
    MarkDown语法学习(Typora)代码块"""代码块语法:```python(python为指定的语法,ps:注意是键盘左上角英文状态下的`)"""print('learnmarkdown')标题'''#一级标题(......
  • .NET 6 实现滑动验证码(二)、基本数据
    上一节,介绍了滑动验证码的基本情况,也创建了一个.NET6的工程。本节内容是创建一些基础类。目录CaptchaData.csCaptchaValidateData.csImageCaptchaInfo.csResource.csSl......
  • Java基础语法
          ......
  • 三. docker-compose 简介、基本命令及示例-1
    docker-compose使用简介、基于docker-compsoe实现Nginx+Java+Mysql服务部署docker-compose简介docker-compose项目是Docker官方的开源项目,负责实现对单机容器的快速编排,d......
  • easylogging++的那些事(四)源码分析(二)日志记录宏(二)其他基本日志宏
    目录CPLOG宏宏展开Info日志宏CPLOG(INFO,xxx)Trace日志宏CPLOG(TRACE,XXX)Debug日志宏CPLOG(DEBUG,XXX)Fatal日志宏CPLOG(FATAL,XXX)Error日志宏CPLOG(ERRO......
  • springboot的基本使用
    SpringBoot简介SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。使用了Spring框架后已经简化了我们的开发,而SpringBoot......
  • Git_基本操作
    目录一、基本命令1、配置账户名+邮箱2、上传至远程仓库流程3、克隆仓库到本地4、查看日志5、版本回滚二、忽略文件三、config常用配置选项四、分支操作1、基本操作2、合并......
  • 登录案例-BeanUtils基本使用、BeanUtils介绍
    登录案例-BeanUtils基本使用、BeanUtils介绍login.html中form表单的action路径的写法 虚拟目录+Servlet的资源路径  BeanUtils工具类,简化数据封装 ......