lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】

2023-05-16


一、lua变量【 全局变量和局部变量和表中的域】

Lua 变量有三种类型:全局变量局部变量表中的域

▪ 全局变量:默认情况下,Lua中所有的变量都是全局变量。

▪ 局部变量:使用local 显式声明在函数内的变量,以及函数的参数,都是局部变量。在函数外即使用local去声明,它的作用域也是当前的整个文件,这相当于一个全局变量。

▪ 表中的域:变量的默认值均为 nil

☺ Lua语言不区分未初始化变量和被赋值为nil的变量,因此全局变量无须声明即可使用。


1、全局变量

全局变量,不需要声明,只需要将一个值赋予一个全局变量即可创建了

b=10 	-- 这个b就是一个全局变量了
print(b)
  • 通常没必要删除一个全局变量,如果一个变量生存周期较为短,使用局部变量即可。不过,如果真的想删除全局变量的话,只需将它赋值为nil。
b=nil 	-- 这个全局变量b就被删除了
print(b)

2、局部变量-使用local 声明

  • Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量

  • 局部变量的作用域为从声明位置开始到所在语句块结束。

建议:在Lua中,应尽可能使用局部变量,好处:

  1. 避免命名冲突
  2. 访问局部变量的速度比全局变量更快

3、lua表中的域

a = {}
a[10] = 1
for i=1,15,1 do
	print(a[i])
end
  • 结果:


二、lua数据类型、if判断条件

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

1、Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型描述
nil空值,只有值nil属于该类,表示一个无效值在条件表达式中相当于false)。
boolean布尔类型
number数值类型,相当于C语言的double
string字符串类型,由一对双引号或单引号来表示
function函数类型,由 C 或 Lua 编写的函数
tableLua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的字面量是用{} 表示。 {},表示创建一个空表。
thread线程类型,表示执行的独立线路,用于执行协同程序
userdata表示任意存储在变量中的C数据结构

2、type(变量名)

  • 作用:获取该变量的类型

3、lua 的if 判断条件是理解为是否有效

▷什么时候会【无效】错误失败—为nil和false的时候

  • nil 表示空值、无效值

▷其他情况为数字、字符串、true、表(甚至是空表也是正确的),判断条件都是【有效】正确成功的!



三、lua数据结构-table

0、table的字面量:{},创建的空表,内部的域默认值是nil。

  • 表用大括号{}来构造,可以是多维的 {{}}。

1、lua中的表,其实是一个"关联数组",关联数组是一种具有特殊索引的数组,数组的索引可以是数组、字符串、表等[除了nil]。

  • 表中的元素是键值对形式。key 也就是数组的索引。表的key是唯一的。表是可以自定义键名。

2、table 是没有固定大小的,可以添加任意数量的元素到数组中。

3、table 是lua中最主要的数据结构机制,也是唯一的数据结构。用它可以实现数组,哈希表、集合、字典等等。还可以通过table 表示对象、包、模块。

其实lua 中的table 概念,相当于java中的对象的概念。万物皆是对象。

4、表中元素的删除,有两种方式:直接设置为nil或调用remove方法删除

  • 两种删除方式的区别:直接把元素赋值为nil,会留下空位,不影响其他元素。而用remove函数去删除,会把后面的元素往前移,补位。

5、表中元素有多少个,可以使用#获取

6、表中的索引是从1开始的

tb={'干饭', '吃饭', '恰饭'}
  • 实际上,tb如下:
-- tb的情况如下:
-- 地址table(c917ad2)
{
 [1] = '干饭',
 [2] = '吃饭',
 [3] = '恰饭',
}

7、表有自定义键的时候:

-- 表中只写了值value作为元素
tb={'干饭', '吃饭', '恰饭', s='溜达'}
  • 实际上,表是有默认分配键key的,默认分配的键是从数字1开始的,tb表中的分配如下:
-- tb的情况如下:
-- 地址table(c917ad3)
{
 [1] = '干饭',
 [2] = '吃饭',
 [3] = '恰饭',
 ['s'] = '溜达',--细节:s会被带上引号
}

细节:要通过自定义的s键获取到值,s是要加上引号的。


对于自定义的键有一个语法糖,中括号可以使用点代替


表中默认分配的键和自定义键的执行顺序是:默认的先执行,然后再是自定义的键

-- 表中只写了值value作为元素
tb={'干饭',a='溜达',b='哈哈哈', _='饿了么','吃饭', '恰饭'}
  • 实际上,tb表中的分配如下:程序分配键的时候,会先跳过自定义键,再接着分配。
-- tb的情况如下:
-- 地址table(c917ad3)
{
 [1] = '干饭',
 [2] = '吃饭',
 [3] = '恰饭',
 ['a'] = '溜达',
 ['b'] = '哈哈哈',
 ['_'] = '饿了么',
}
  • 结果:

8、table 提供的增删元素的方法 table.insert 和 table.remove

  • table.insert(表名,要增加的键位,要增加的值) 直接再最后的位置增加元素:table.insert(表名,要增加的值)

  • table.remove(表名,要删除的键位)



四、lua 函数(形参-实参数数量不匹配、多重返回值、不定长参数、方法的冒号和点-self隐式参数)

0、lua 程序是严格从上到下的顺序执行代码的, 函数的声明必须在写函数调用前面。


在lua中,函数是作为第一类型,函数是可以存在在变量中,也可以通过参数传递给其他函数,还可以作为其他函数的返回值,还可以作为table表中的键

1、函数定义的方式

-- 方式1:
function 函数名(参数列表)
	函数内容
end


-- 方式2:
函数名=function(参数列表)
	函数内容
end

2、lua 函数

① 函数是可以存在在变量中【匿名函数

a = function(x, y)
	return x * y
end
b = a
print(b(2,3))
  • 结果:

    6

▪ 在table中也可以存在function函数

tab = {
	test=function()
		print("Hello World!")
	end
}
tab.test()
  • 结果:

Hello World!

3、形参-实参数数量不匹配

  • 传入的实参数量 > 定义的形参数量:多传入的参数,直接被忽略了
  • 传入的实参数量 < 定义的形参数量:缺少的参数,使用nil替补

4、多重返回值

  • 举例1:


  • 举例2:

  • 小细节:多个具有多重返回值的函数连续调用[使用,间隔],只有最后一个函数被展开,即最后一个函数才有资格返回多个值,其他函数都默认返回第一个值


5、不定长参数

  • 和java 一样,不定长参数使用…表示,并且作为函数的最后一个参数。
  • select 函数来访问变长参数了
    • select(‘#’, …) 返回可变参数的长度。
    • select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表。


6、方法的冒号和点-self隐式参数

▷ Lua 定义或调用方法时的语法糖-冒号,表示参数self

这个语法糖是用冒号,表示self,相当于java中的this

■ 举例1:

--定义
Account = { balance = 0 }
--withdraw 方法有两个参数,一个self【相当于java中的this】是指向当前table的Account 
function Account.withdraw(self, v)
         self.balance = self.balance - v
end
--等价写法:
function Account:withdraw(v) --通过冒号,表示定义了第一个参数是self
         self.balance = self.balance - v
end

--调用
Account.withdraw(self, 100)
--等价写法
Account:withdraw(100)        

■ 举例2:

-- 在table的键值对的value---是function的时候,方法的参数是self,并且还将self 参数传递给function方法体的另外一个方法
-- {} 在lua中表示table
tbWnd.tbOnClick = {
    btnOk = function(self)
        self:onClickOK() -- 相当于onClickOK(self)
    end,
}

7、函数嵌套调用,并且作为参数的那个函数,它是需要有参数传入

① 通过将参数存储到table中,table又绑定上的函数,该函数就可以通过self.key 拿到参数

② 然后外层的函数(func,table)

local tbTable = {}
tbTable.key1  = 1
function tbTable:func1()--这样写,隐式参数是self
    print(self.key1)
end


-- 函数嵌套调用
function func2(func,tbSelf)
    func(tbself)
end

-- 执行
func(tbTable.func1)

8、函数返回值为空,nil 可以省略,return nil 也可以省略


9、函数的括号在只有一个参数[并且参数是字符串或者表]的情况下可以省略不写

  • 一般是在调用的时候,明确已经参数是字符串或者表,才可以省略括号
-- 举例1:
print("Hello") --> print "Hello"


-- 举例2:
function func (num)
	print(num)
end

func "hello"
func {1,2,3}
  • 细节:不知道参数类型的情况下,是不可以省略括号的



☺ 五、lua 函数常见写法

1、直接构建

function func(...)
    print(...)
end

-- 调用函数
func(123)

2、表构建,key存储函数(1)

local tbTable = {}
function tbTable.func1(...)
    print(...)
end

function tbTable.func2(...)
    print(...)
end

-- 调用函数
tbTable.func1(123)
tbTable.func1(4,5,6)

3、表构建,key存储函数(2)

local tbTable = {}

tbTable.func1 = function(...)
    print(...)
end

tbTable.func2 = function(...)
    print(...)
end

-- 调用函数
tbTable.func1(123)
tbTable.func1(4,5,6)

4、表构建,key存储函数(3)

local tbTable = {
    func1 = function(...)
    	print(...)
	end,
    func2 = function(...)
    	print(...)
	end
}

-- 调用函数
tbTable.func1(123)
tbTable.func1(4,5,6)



六、函数嵌套|闭包

1、local 特点:

局部变量:使用local 显式声明在函数内的变量,以及函数的参数,都是局部变量。

在函数外即使用local去声明,它的作用域也是当前的整个文件,这相当于一个全局变量。


2、函数嵌套|闭包

(1) 特点:函数的调用是用() 表示,有多少层,函数真正调用就需要多少个()

(2) 举例子:

  • 举例子1:
local f = function(n)
	return function(x)
		return x+n
	end
end

print(f(1)(2)) -- 函数嵌套,每一层都相当于()

a = f(1)
print(a(10))
  • 结果:

    3
    11


  • 举例子2:local 在函数外相当于java的全局变量【独立的作用域强调的就是这个在函数外面的local 变量】
local p = 1
local f = function()
	local v = 0 -- local 在[下面的]函数外面相当于java的全局变量
	return function()
		v = v + p
		print(v)
	end
end	

a,b = f(), f()
a(); b();
p = 2
a(); b();
  • 结果:

    1

    1

    3

    3

  • local 在函数外相当于java的全局变量【独立的作用域

class A{
   private int v; -- 全局变量
   public void add(){}
}

  • 举例子3:
local f = function()
	return {
        add = function(a,b)
			return a + b
	   end,
        sub = function(a,b)
			return a - b
	   end,
    }
end	

v = f()
print(v.add(1,2))
print(v.sub(2,1))
  • 结果:

    3
    1




如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】 的相关文章

  • 政务外网后端接口PUT和DELETE不通

    政务外网后端接口PUT和DELETE不通 错误信息 解决思路 1 xff0c 首先排查政务内网环境下接口是否能通 2 查看nginx反向代理问题 3 查看接口是否调通后端 xff0c 后端是否有相应信息 4 排查端口是否对外开放 5 关闭防
  • 安装Anaconda3后缺失大量文件的解决方法:安装旧的版本再升级

    项目场景 xff1a 安装Anaconda3 项目场景 xff1a 安装Anaconda3后缺失大量文件 问题描述 安装Anaconda3后缺失大量文件 正确安装后的样子 xff1a 原因分析 xff1a 找了很多帖子 xff0c 也尝试了
  • IOS开发 汉化

    UIImagePicker TZImagePicker选择图片时默认是英文 只需要修改xcode本地设置即可 xff0c 具体操作如图示 1 选择info 2 添加Localizations 3 将English改成Chinese 2 iO
  • WSL2 Linux搭建xfce4桌面和使用xrdp远程连接

    基于Ubuntu20 04测试 1 安装 span class token function sudo span apt span class token function install span xfce4 xrdp y 如果遇到下面页
  • 修改 WSL2 可用内存大小和交换分区大小

    WSL2默认可以使用的内存大小为主机的80 对于Linux而言即使装了桌面 一般的开发也没必要给这么多内存 分多了 反而有可能卡主机的Windows 操作 1 打开Windows资源管理器 地址栏输入 UserProfile 回车 在该目录
  • C++代码: Linux下获取基本设备信息

    测试环境 基于C 43 43 20构建测试 g 43 43 10 2 1 CMakeLists txt 设置用于构建该项目的最低cmake版本 cmake minimum required VERSION 3 1 设置项目名称和编程语言 p
  • VMware虚拟机Ubuntu无法使用摄像头的问题

    注 之前我在使用Ubuntu的虚拟机中 搞OpenCV开发 需要使用摄像头 遇到了摄像头无法使用的问题 后面折腾了很久才发现 USB3 1 兼容设置的问题 刚才又用新的虚拟机配置环境 又遇到了之前的问题 因此做个记录 1 摄像头未连接到虚拟
  • 一文搞懂光纤的方方面面

    光纤 一直以为光纤模块会非常贵 xff0c 呃 xff0c 只能说没有想象中的贵 xff0c 相比网线还是贵上不少 一个常见的光纤系统通常会包括收发器 xff0c 光电转换器还有光纤收发器 通常简单的入门级一套下来可能也在200 300左右
  • msys2配置cmake构建环境

    注 本人主要在Linux下搞开发 使用msys2是为了方便移植部分程序到Windows下 做以下纪录方便环境配置 1 换源 span class token comment 更新本地软件数据库 span pacman Sy 2 安装开发工具
  • Windows 10安装 WSL2 (Ubuntu 20.04)

    条件 对于 x64 系统 xff1a 版本 1903 或更高版本 xff0c 采用 内部版本 18362 或更高版本 对于 ARM64 系统 xff1a 版本 2004 或更高版本 xff0c 采用 内部版本 19041 或更高版本 低于
  • Ubuntu 20.04 server 切换中文语言

    1 安装区域设置 locales Ubuntu 一般是预装了的 Kali Linux 和 Debian可能没有 就需要安装 更新索引 sudo apt update span class token comment 安装locales sp
  • 全新安装的Termux配置Ubuntu环境

    基于 Termux 0 101 测试 换国内源 默认官方源在国外速度慢 有梯子的话也可以不换 这里换清华源为例 更多 执行命令 span class token function sed span i span class token st
  • 1g 路由器使用

    前言 xff08 1 xff09 首次使用以及断网后配置都可参看本文 xff08 2 xff09 简谈 xff0c 创翼实际登录拨号的账号其实并不是 电话 64 cqit xff0c 而是在这个账号前面根据拨号时间生成一个随机字符串 xff
  • 基于随机森林的手写数字识别 (OpenCV)

    OpenCV 4 5 1 C 43 43 20 Ubuntu 20 04 素材 来源 基于 K近邻博文 中原5000个手写数字得到的按行排列的手写数字数据以及对应行的标签 保存为图片后直接放到这里使用 避免重复数据处理 右键图片另存为 行数
  • 使用支持向量机分类 (OpenCV)

    OpenCV 4 5 1 C 43 43 20 Ubuntu 20 04 素材 像素点和分类标签 组态档 设置用于构建该项目的最低cmake版本 cmake minimum required VERSION 3 1 设置项目名称和编程语言
  • 退出该博客平台声明

    试用c s d n快三个月了 xff0c 最不满的就是审核的问题 1 我自己写的东西因为有误修改了一下再提交就说我的博文已有相似的 xff0c 审核不通过 xff0c 不止一次 2 反而好奇有人抄了我的却发出去了 这应该是最后一次在这里发文
  • CMake Error at CMakeLists.txt:11 (find_package): Found package configuration file: /home/luw

    参考资料 xff1a https www cnblogs com newneul p 8364924 html CMake Error at CMakeLists txt 11 find package Found package conf
  • LPC1768学习笔记

    LPC1768学习笔记 xff1a IAP升级 1 需求 xff1a 通过串口给主机升级 xff0c 主机的通信串口与升级串口相同 2 方法 xff1a 要完成APP与IAP程序的切换判断 xff0c 我们需要一个flag update单独
  • 手把手教你如何实现一个简单的数据加密算法

    0 前言 之前写过一篇关于MD5摘要算法的文章 xff0c 很多老铁说能否出一篇关于加密的文章吗 xff1f C语言实现MD5 xff0c 竟如此简单 xff01 一口君的字典里没有 34 不行 34 这两个字 xff01 必须安排 xff
  • python压缩包安装方式

    下载压缩包 从python官网下载embed package xff08 嵌入式包 xff09 解压并进入到解压目录 xff0c 看到python exe为止 下载pip依赖 下载https bootstrap pypa io get pi

随机推荐