千家信息网

Lua有哪几种变量类型

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,今天就跟大家聊聊有关Lua有哪几种变量类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用命令查看版本lua -v进入交互模式(ctrl+D
千家信息网最后更新 2024年09月22日Lua有哪几种变量类型

今天就跟大家聊聊有关Lua有哪几种变量类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

常用命令

查看版本

lua -v

进入交互模式(ctrl+D退出)

lua -i


变量类型

Lua有8种变量类型

type函数可以返回变量的类型

> a=true> type(a)boolean

tonumber 函数可以将字符串转成数字

> tonumber(33.3)33.3> tonumber('42')42> tonumber('hello')nil

Lua的字符串是immutable的,可以使用双引号或单引号。

> x="hello"> y='world'> print(x,y)hello   world> print("hello\nworld")helloworld> x="\65\66\67\0"> xABC

使用[[ ]]表示多行字符串

> print([[>> good>> or>> bad?>> ]])goodorbad?

如果将一个变量赋值为nil,变量将被垃圾回收, 垃圾回收机制是自动的,通常不需要手动进行垃圾回收,有一个 collectgarbage()的函数。

falsenil是lua唯二的falsy值,这意味着 -1 这种在PHP中为false的值在Lua是真值。

逻辑运算符

> a = (1>2) and 1 or 2 --等同于其他语言的三元运行符 a= (1>2) ? 1 : 2> a2> not afalse> not not atrue

多个变量同时赋值

> x,y=42,43> x,y42      43> x,y,z=1,2 -- 不赋值的变量为nil> x,y,z1       2       nil

Table 类型

> t={}> t.abc=33> t.cde=44> ttable: 0x7ffd93f0df30> t.fghnil> t.abc33

获取一个未定义的元素,会返回nil,但是尝试获取一个未定义的元素下的属性,会抛出一个错误

> t.fgh.xyzstdin:1: attempt to index a nil value (field 'fgh')stack traceback:        stdin:1: in main chunk        [C]: in ?>

table下的元素可以是任何值,甚至可以是函数,如:

> t.fun=print> t.fun('hello')hello


跟php的数组类型类似,table可以表示其他语言的数组和hash(字典),

注意:lua的数组并不是一个特殊的变量类型,而只是table的一种形式,并且Lua数组的索引从1开始,而非0

> t1={1,2,3}> t1[1]1> t2={a = 1, b = 2}> t2.a1

#取数组长度,也可以取字符串的升序,但对hash类型的table长度似乎不行,会返回0 ,怎么取?(@todo)

> =#t13

table 变量类型可以是任何lua支持的类型,甚至可以是函数,比如:

> t={x=print}> t.x('hello')hello

如果想要指定non-identifiers(非标志符?) 作为Tablekey ,需要用[]表示

> t2={[34]=123,[true]=321}> t2[34]123> t2[true]321

Lua操作符

< > <= >= == ~=

所有这些操作符产生的结果都是true或者false

'=='检查是否相等,'~='检查是否不等。这两个操作符可以作用于任意的两个值。如果要比较的两个值是不同的类型,那么Lua认为它们是不等的。否则,Lua根据它们的类型来比较它们是否相等。特例,nil只等于它本身

Lua根据引用来比较table, userdata, function,也就是说,只有二者是同一个对象的时候,它们才相等。例如:

a = {}; a.x = 1; a.y = 0b = {}; b.x = 1; b.y = 0c = a

执行下上面的代码,你可以得到, a == c, 但是 a ~= b

函数和闭包

闭包是指一个引用函数外定义的变量的函数,而且这个变量不是Gobal的。

dofile('fn.lua')  --引入一个文件

如果调用时参数不够,缺失的参数会赋值为 nil

如:

function fn(name1,name2,name3)     print(name1,name2,name3)    return 0endfn('a','b')

打印 a b nil

如果调用参数多于定义参数,多余的参数会被丢弃。

对返回值的处理也是类似:

function fn(name1,name2,name3)     -- print(name1,name2,name3)    return 1,2endx,y,z = fn('a','b')print (x,y,z)

打印结果

1       2       nil

匿名函数

v = function() return 0 end

本地函数 创建模块时经常会被使用。

local function hi(name) print('hi ' .. name) end


闭包

function adder(x)    return function (y)        return x + y     endenda1 = adder(1)a100 = adder(100)print(a1(3))print(a100(3))

结果:

4 103

Chunk

lua执行的每一块语句,比如一个文件,一行代码,一个函数都可以理解为一个chunk。

如果dofile引入一个文件chunk.lua,内容如下

local x = 123y=456return 789

结果:

> dofile('chunk.lua')789> =y456> =xnil

在交互模式下,每一条可执行的语句是一个chunk,一个local的变量在下一个chunk中不可见, 如:

> local x=3> xnil -- 不可见

除非使用 ; 写在同一个chunk

> local y=4; print(4)4

注释

lua 有两种注释方式

print("hello comment") -- 单行注释function hello()    print("hello comment")--[[这是多行注释]]end

//@to-be-continue

看完上述内容,你们对Lua有哪几种变量类型有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0