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
相关推荐
IMPYLH7 小时前
Lua 的 type 函数
开发语言·笔记·后端·junit·lua
IMPYLH9 小时前
Lua 的 tostring 函数
开发语言·笔记·junit·单元测试·lua
IMPYLH11 小时前
Lua 的 setmetatable 函数
开发语言·笔记·后端·游戏引擎·lua
卿着飞翔11 小时前
系统架构设计师论文分享-论单元测试方法及其应用
系统架构·单元测试
谷粒.1 天前
让缺陷描述更有价值:测试报告编写规范的精髓
java·网络·python·单元测试·自动化·log4j
晚霞的不甘1 天前
Flutter + OpenHarmony 自动化测试全攻略:从单元测试到多设备真机云测
flutter·单元测试
雨落秋垣1 天前
优化 OpenResty 的性能
junit·openresty
川石课堂软件测试2 天前
自动化测试的基本概念及常用框架
数据库·python·功能测试·测试工具·单元测试·自动化·流程图
川石课堂软件测试2 天前
使用loadrunner调用mysql API进行性能测试
服务器·数据库·python·selenium·mysql·单元测试·自动化