Lua基础语法

一、运算符

lua不支持位运算( & |)和三目运算符( ? :),也不支持++、--、 +=、 -=等算术运算符。

1.算术运算符(+ - * / % ^)

lua 复制代码
print("加法:"..1+2)
print("123"+1)        --字符串进行算术运算,会自动转成number  
print("减法:"..1-2)
print("乘法:"..1*2)
print("除法:"..1/2)
print("余数:"..1%2)  
print("幂运算:"..3^2) 
 
--加法:3
--124
--减法:-1
--乘法:2
--除法:0.5
--余数:1
--幂运算:9

2.件运算符(< > <= >= == ~=)

lua 复制代码
print("1<2?"..tostring(1<2))
print("1>2?"..tostring(1>2))
print("1==2?"..tostring(1==2))
print("1~=2?"..tostring(1~=2))
 
--1<2?true
--1>2?false
--1==2?false
--1~=2?true

3.逻辑运算符(and or not,支持短路规则)

lua 复制代码
print(true and false)
print(true or false)
print(not false)
 
--false
--true
--true

二、条件分支语句

Lua 中的条件分支语句主要是通过 if、then、elseif、else 和 end 关键字来实现的。Lua中没有switch。

1.单分支

lua 复制代码
a = 10
if a>5 then 
	print("a>5")
end

2.双分支

lua 复制代码
a = 10
if a>5 then 
	print("a>5")
else 
	print("false")
end

3.多分支

lua 复制代码
a = 10
if a>5 then 
	print("a>5")
elseif a==5 then   --注意:elseif要连着写
	print("a=5")
else 
	print("a<5")
end

三、循环语句

在Lua中,循环语句允许重复执行一段代码多次。Lua提供了几种循环语句,包括for循环、while...do...end循环和repeat...until...循环。

1.for循环

Lua中的for循环有两种形式:数值for循环和泛型for循环。

(1)数值for循环

lua 复制代码
print("--------------for,默认递增1")
for i=1,5 do  
	print(i)
end
 
print("--------------for,自定义增量,递增2")
for i=1,5,2 do  
	print(i)
end
 
print("--------------for,自定义增量,递减1")
for i=5,1,-1 do  
	print(i)
end

(2)泛型for循环

用于迭代表(table)和其他迭代器。

lua 复制代码
for key, value in pairs(mytable) do
    print(key, value)
end

2.while...do...end循环

lua 复制代码
a=5
while a<10 do
	print(a)
	a=a+1
end

3.repeat...until...循环

repeat...until...循环保证至少执行一次,即使条件从一开始就是假的。所以要防止死循环。

lua 复制代码
a=5
repeat 
	print(a)
	a=a+1
until a>10

四、多脚本执行

1.本地变量和全局变量

在Lua中,变量可以是全局的或局部的,这取决于它们是如何声明的。

  • 全局变量在Lua中不需要明确声明就可以使用。如果你赋值给一个未声明的变量,Lua会自动将其视为全局变量。全局变量在整个Lua程序中都是可见的,除非它们被特定的环境或模块限制。
  • 局部变量在Lua中使用关键字local进行声明。它们的作用域被限制在了它们被声明的代码块内。这意味着它们只能在定义它们的函数内部、控制结构内或代码块内被访问。
lua 复制代码
a=10         --全局变量
b="hello"    --全局变量
for i=1,5 do
	c=i*2    --c也是全局变量
end
print(c)     --10
 
for i=1,5 do
	local d=i*2  --局部变量
end
print(d)     --nil

2.require("脚本名")

在Lua中,require函数用于加载和运行库或模块。

  • 新建一个test.lua脚本(脚本可以return 一个局部变量)
lua 复制代码
print("this is test")
testA=10     --全局变量
local x = 1  --局部变量
x=x+1
return x
  • 在别的脚本中执行test.lua
lua 复制代码
require("test")        --注意是同一个路径
print(testA)           --可调用另一个脚本的全局变量
print(x)               --不可调用另一个脚本的局部变量
 
--this is test
--10
--nil

当使用require来加载一个模块时,Lua会检查该模块是否已经加载过。如果已经加载过,Lua不会再次加载该模块,而是直接返回之前加载的结果。这是通过一个内部的包加载表(package.loaded)来实现的,其中存储了所有已加载模块的状态。如果在上述代码之后仍然require("test") ,则不会输出this is test。

3.package.loaded["脚本名"]

如果想检查一个模块是否已经被执行过(即已经被加载过),你可以检查 package.loaded 表中对应的条目。如果条目存在并且不是 nil,则表示该模块已经被加载过了。

lua 复制代码
print(package.loaded["test"])   --2
package.loaded["test"]=nil      --卸载
print(testA) --但是还会输出

执行了print(package.loaded["test"])并且得到了输出 2,这是因为名为 "test" 的模块被加载,并且它返回了值:2。

lua 复制代码
temp=require("test") --可以加local,不加的话会存在_G中
print(temp)       --2
print(_G["temp"]) --2

卸载后print(testA)仍然输出10,是因为:在Lua中,全局变量是存储在全局环境_G中的变量,这是一个存储所有全局变量的表。如果你加载并运行了一个Lua脚本,它定义了全局变量,即使之后你卸载了这个脚本,这些全局变量仍然会留在全局环境_G中,除非你显式地删除它们或者重置它们的值。

4.大G表

在 Lua 中,全局环境是由一个名为 _G 的特殊表来表示的。这个表被称为"全局表"(Global Table),简称"大G表"。它包含了所有的全局变量,你可以通过它访问或修改这些变量。Lua中的全局变量实际上是_G表的键值对。当你在Lua中创建一个全局变量时,实际上是在_G表中添加了一个元素。同样,访问一个全局变量就是在查询_G表。

lua 复制代码
for i,k in pairs(_G) do
	print(i,k)
end

需要注意的是,直接操作 _G 表可能会影响到全局环境的完整性,所以通常建议谨慎使用,尤其是在大型项目或者多人合作的项目中。使用局部变量(local)可以避免不必要的全局污染。

5.dofile

在Lua编程语言中,dofile 和 require 都是用来加载和执行Lua文件的,但它们之间存在一些重要的区别。

  • dofile:这个函数会加载并执行指定的文件,但不会对其进行任何形式的缓存。也就是说,每次调用 dofile时,Lua都会重新加载和执行该文件。如果你有一个文件需要多次执行,而且每次执行的结果都可能不同,那么 dofile 是一个不错的选择。
  • require:这个函数也会加载并执行指定的文件,但它会对文件进行缓存。当你第一次 require
    一个文件时,Lua会加载和执行该文件,然后把文件的返回值存储在一个特殊的表中。当你再次 require同一个文件时,Lua不会重新加载和执行该文件,而是直接返回这个表中的值。这意味着,如果你的文件只需要被执行一次,或者每次执行的结果都应该是相同的,那么require 是一个更好的选择。
lua 复制代码
r=dofile("test.lua")   --注意需要加后缀
print(r)
 
--this is test
--2

五、特殊用法

1.多变量赋值

个数不对应,自动补nil或省略。

lua 复制代码
a,b,c,d,e=1,"hello",true,nil
print(a,b,c,d,e)
 
--1	hello	true	nil	nil

2.多返回值

个数不对应,自动补nil或省略。

lua 复制代码
function test()
	return 10,20,30
end
a,b=test()
print(a,b)

3.逻辑与、逻辑或

任何类型都能连接。只有nil和false才是假,0是真,"false"也是真。

lua 复制代码
print(1 and 2) --2   --1满足,判断2,返回2
print(0 and 1) --1   --0满足,判断1,返回1
print(1 or 2)  --1   --1满足,返回1(短路原则)
print(nil and 0) --nil
print(false or 1) --1
print(nil or "hello") --hello
print("false" or "1") --false
print("false" and "nil") --nil

4.实现三目运算符

lua不自持三目运算符。但是利用and和or可以实现三目运算符。

lua 复制代码
x,y=3,2
res=(x>y) and x or y
print(res) --3
 
x,y=3,4
res=(x>y) and x or y
print(res) --4
相关推荐
分享牛1 天前
Operaton入门到精通23-Operaton 2.0 原生支持 JUnit 6 核心指南
数据库·junit
@大迁世界1 天前
6 款轻量级 CLI 工具,取代了我臃肿的开发软件
开发语言·lua
Lyyaoo.1 天前
Spring Boot日志
spring boot·缓存·单元测试
无籽西瓜a1 天前
Docker 环境下 Redis Lua 脚本部署与执行
redis·docker·lua
bug攻城狮1 天前
为什么 Spring Boot 要单元测试?
spring boot·后端·单元测试
想做后端的前端2 天前
Lua的元表和元方法
开发语言·junit·lua
呆子也有梦2 天前
思考篇:积分是存成道具还是直接存数值?——ET/Skynet 框架下,从架构权衡到代码实现全解析
游戏·架构·c#·lua
indexsunny2 天前
互联网大厂Java面试实战:从Spring Boot到微服务与Kafka的深度探讨
java·spring boot·junit·kafka·mybatis·hibernate·microservices
liulilittle2 天前
Lua中检测32位序号环绕的方法
junit·单元测试·lua
历程里程碑3 天前
链表-----
数据结构·线性代数·算法·链表·矩阵·lua·perl