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

这篇具有很好参考价值的文章主要介绍了lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、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 编写的函数
table Lua 中的表(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




如果本文对你有帮助的话记得给一乐点个赞哦,感谢!文章来源地址https://www.toymoban.com/news/detail-417838.html

到了这里,关于lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python条件判断语句(if else)

            python中判断语句的基本结构由if和else组成,当if后面的条件为真时,执行if下面的语句;当if后面的条件为假时,执行else下面的语句。这里条件的真假都是用bool值来作为依据的,我们知道比较运算、成员运算、身份运算返回的结果都是bool值。所以比较运算、成员运算

    2024年02月09日
    浏览(59)
  • SQL中的单条件判断函数IF,和多条件判断CASE WHEN的用法

    在SQL中,条件判断函数IF用于根据指定的条件返回不同的值。 condition:要判断的条件。 value_if_true:如果条件为真,则返回的值。 value_if_false:如果条件为假,则返回的值。 假设有如下名为studensts的表,包含id、name和score字段: 我们想根据学生的分数判断是否及格,并返回相

    2024年02月11日
    浏览(85)
  • shell 脚本中 if 各种条件判断的使用

    1.1 if-elif-else语法格式 1.2 if-else语法格式 1.3 if语法格式 示例: 运行结果: 示例: 运行结果: 示例: 运行结果: 示例: 运行结果:

    2024年02月17日
    浏览(56)
  • MySQL中使用IF子查询实现条件判断(where之后用if)

    废话不多说,直接上代码

    2023年04月23日
    浏览(66)
  • MATLAB知识点:if条件判断语句的嵌套

     ​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自​第4章:MATLAB程序流程控制 我们通过一个经典例题来理解if的嵌套,所谓if的嵌套,是指在if、els

    2024年04月09日
    浏览(45)
  • python基础语法(print、数据类型、变量、注释、输入、条件语句)

    计算机中所有的数据本质上都是用0和1的组合来存储的。编码就相当于密码本,在计算机中有多个密码本:utf-8编码、gbk编码等 注意事项:在计算机中若以某个编码形式进行保存文件,以后也要以这种编码形式去打开这个文件,否则就会出现乱码。 编码必须要保持:保存和打

    2024年02月05日
    浏览(57)
  • js中如何判断一个变量的数据类型?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月09日
    浏览(41)
  • Windows 批处理(bat) if条件判断语句使用教程

    在bat脚本中,if条件判断语句共有6种比较操作符,分别为 操作符(不区分大小写) 描述 全称 equ 等于 equal neq 不等于 no equal lss 小于 less than leq 小于等于 leq less than or equal gtr 大于 greater than geq 大于等于 geq greater than or equal 其中,只有等于操作符可以使用符号 “==” 表示,其

    2024年02月03日
    浏览(53)
  • 《人生苦短——我学Python》条件判断->双向选择(if--else)

    今天我们来学习双向选择判断。顾名思义,双向就是两种选择选其一,即 if----else 。如果If的条件不成立,则执行 else 下的语句,否则执行 if 下面的语句。显然,它们是 互斥 的!下面就让我们来详细看看吧! if 后面的语句是当判断 条件成立 时, 需要执行 的操作。 else 后面

    2024年02月10日
    浏览(40)
  • MySQL 判断语句 条件函数 case when、if、ifnull

    在MySQL中,需要用到条件判断函数,例如 case when、if、ifnull。 (1)if 注意: 一个条件表达式两个结果 expr :条件表达式; 如果结果为true,则返回result_true,否则返回result_false。 (2)ifnull 注意: 如果查询结果是 null ,就转换为特定的值 result :查询结果; value :如果查询结

    2024年02月04日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包