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

news2024/12/23 9:25:00

一、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




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

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

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

相关文章

Golang每日一练(leetDay0040)

目录 118. 杨辉三角 Pascals Triangle &#x1f31f; 119. 杨辉三角 II Pascals Triangle II &#x1f31f; 120. 三角形最小路径和 Triangle &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/…

港联证券策略:A股市场短期预计将保持区间震荡

港联证券以为&#xff0c;跟着4月30日的接近&#xff0c;一切板块的年报以及一季度报将进入密布发表期。从历史数据来看&#xff0c;4月中旬今后指数震动调整的概率较大&#xff0c;在操作上需注意操控全体仓位。从板块方面看&#xff0c;近期为数字经济和中特估双主线驱动的行…

Adobe lr中文版下载官方版 专业摄影师的必备软件 附各个平台

说到修图软件&#xff0c;大家第一时间一定都能联想到Adobe旗下的Photoshop&#xff08;Adobe Photoshop CC&#xff09;和Lightroom&#xff08;Adobe Photoshop Lightroom CC&#xff09;&#xff0c;其中PhotoShop很多设计师都找到了对应的手机版&#xff0c;但有些用户由于…

MacOS 上安装并配置 OpenJDK 图文详细版

1、概述 1.1、什么是 OpenJDK &#xff1f; OpenJDK 是 Java 的一个开源实现&#xff0c;由 Sun Microsystems 于2006年开始发布&#xff0c;是 Java SE 平台&#xff08;Java Standard Edition&#xff09;的参考实现之一。OpenJDK 是由 GPL v2 授权下的自由软件&#xff0c…

Msray-Plus采集工具帮您快速获取数据,让您的市场营销更加精细

随着互联网的不断发展&#xff0c;数据已经成为企业竞争的重要资产之一。市场营销人员需要通过数据来了解客户需求、市场趋势和竞争对手情况&#xff0c;从而制定更加精细的市场营销策略。然而&#xff0c;采集数据并不是一件容易的事情&#xff0c;需要耗费大量的时间和精力。…

Java多线程基础学习(一)

1. 创建线程 1.1 通过构造函数&#xff1a;public Thread(Runnable target, String name){} 或&#xff1a;public Thread(Runnable target){} 示例: Thread thread1 new Thread(new MyThread(), "mythread"); class MyThread extends Thread(){public void …

天阳转债上市价格预测

天阳转债 基本信息 转债名称&#xff1a;天阳转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;9.75亿元。 正股名称&#xff1a;天阳科技&#xff0c;今日收盘价&#xff1a;15.68元&#xff0c;转股价格&#xff1a;14.92元。 当前转股价值 转债面值 / …

RHCE---服务+ansible

一、命令提示符颜色 也可以写入配置文件/etc/profile [rootmaster ~]# vim .bashrc 绿色&#xff1a; PS1\[\033[01;32m\]\u\H:\[\033[01;34m\]\w\$\[\033[00m\] 粉红色&#xff1a; PS1\[\e[1;35m\]\u\h:\[\e[0m\]\[\e[1;33m\]\w\[\e[1;35m\]\[\e[0m\]\[\e[1;34m\]\$ \[\e[0…

[架构之路-168]-《软考-系统分析师》-4-据通信与计算机网络-4/5- 常见网络设备与网络工程

目录 4 . 4 网络互连与常用设备 1 . 网络互连设备 2 . 交换技术 3 . 路由技术 4 . 5 网络工程 4.5.1 网络规划&#xff08;要做什么&#xff1f;打算怎么做&#xff1f; 什么时间做&#xff1f;&#xff09; 1 . 网络需求分析 2 . 可行性研究 3 . 对现有网络的分析与描…

【Dom获取属性操作】JavaScript 全栈体系(十)

Web APIs 第四章 操作元素属性 一、操作元素常用属性 还可以通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性比如&#xff1a; href、title、src 等语法&#xff1a; 对象.属性 值 <!DOCTYPE html> <html lang"en">&…

【c#串口通信(4)】串口调试助手的使用

前言: 关于本文中使用到的串口助手工具,订阅专栏后,加入vip群,即可在群文件免费下载 1、打开串口 1.1 选择端口号 在下图的箭头所指处,选择下拉框中你想打开的串口,因为我之前使用虚拟串口工具虚拟了COM1、COM3,所以我可以先选择COM2 1.2 设置好参数 1.2.1 波特率:…

Python数据结构与算法篇(九)--单调栈与单调队列

1 单调栈 1.1 介绍 栈&#xff08;stack&#xff09;是很简单的一种数据结构&#xff0c;先进后出的逻辑顺序&#xff0c;符合某些问题的特点&#xff0c;比如说函数调用栈。 单调栈实际上就是栈&#xff0c;只是利用了一些巧妙的逻辑&#xff0c;使得每次新元素入栈后&#x…

rhcse中配置DNS的正反向解析

实验一 正向解析 服务端ip 192.168.9.30 客户端ip 192.168.9.31 网址 www.openlab.com 安装DNS软件 服务端 [rootlocalhost ~]# yum install bind -y 客户端与服务端相同 编辑DNS主配置文件 修改其中的11和19行 listen-on port 53 { any; }; allow-query { a…

homeassistant配置MQTT集成以及传感器实体(STM32连接进入homeassistant)

大家可以看作者的小破站教学视频&#xff08;如果喜欢的话可以点个关注&#xff0c;给个三联&#xff01;啊哈哈哈哈哈哈&#xff09;&#xff1a; 【homeassistant配置MQTT集成以及传感器实体&#xff08;STM32连接进入homeassistant&#xff09;】 最近homeassistan更新之后…

Python VTK计算曲面的高斯曲率和平均曲率

introduction&#xff1a; Python VTK计算曲面的高斯曲率和平均曲率&#xff0c;如何使用户Python版本的VTK计算曲面的高斯曲率并映射在曲面上。使用了两个不同的表面&#xff0c;每个表面根据其高斯曲率和平均曲率着色. Display: Step: 本文介绍了 如何使用户Python版本的V…

什么是软件开发脚手架?为什么需要脚手架?常用的脚手架有哪些?

什么是软件开发脚手架&#xff1f;为什么需要脚手架&#xff1f;常用的脚手架有哪些&#xff1f; 微服务本身是一种架构风格&#xff0c;也是指导组织构建软件的一系列最佳实践集合。然而&#xff0c;业务团队在拆分应用后&#xff0c;会产生更多细粒度服务&#xff0c;并面临…

基于LINUX实现ping发送与接收

作用 Linux ping 命令用于检测主机&#xff1a;执行 ping 会使用 ICMP 传输协议&#xff0c;发出要求回应的信息&#xff0c;若远端主机的网络功能没有问题&#xff0c;就会回应该信息&#xff0c;因而得知该主机运作正常。 基础使用 #ping 192.168.1.1//ping 主机ip#ping -…

【项目】视频列表滑动,自动播放

自动播放 期望效果&#xff0c;当滑动列表结束后&#xff0c;屏幕中间的视频自动播放HTML页面data变量实践操作&#xff01;重点来了&#xff01;滚动获得的数据实现效果源码&#xff08;粘贴即可运行&#xff09; 期望效果&#xff0c;当滑动列表结束后&#xff0c;屏幕中间的…

C. Anna, Svyatoslav and Maps(floyd + 思维)

Problem - C - Codeforces 给你一个有n个顶点的无权图&#xff0c;以及由m个顶点的序列p1,p2,...,pm给出的路径&#xff08;该路径不一定简单&#xff09;&#xff1b;对于每个1≤i<m&#xff0c;有一个弧从pi到pi1。 如果v是p的子序列&#xff0c;v1p1&#xff0c;vkpm&a…

重学Java设计模式-行为型模式-命令模式

重学Java设计模式-行为型模式-命令模式 内容摘自&#xff1a;https://bugstack.cn/md/develop/design-pattern/2020-06-21-重学 Java 设计模式《实战命令模式》.html#重学-java-设计模式-实战命令模式「模拟高档餐厅八大菜系-小二点单厨师烹饪场景」 命令模式介绍 图片来自&a…