Lua变量、数据类型、布尔运算
回到:
8种基本类型
Lua中有8种基本数据类型:
1 | number, string, nil, boolean |
其中userdata需要使用C或其它宿主语言来定义。
在Lua 5.2以及之前的版本只有number,它们都以双精度浮点数的方式表示,它能表达的最大整数是2^53^。在Lua 5.3中,引入了两种类型的数值类型:
- integer,64位整型
- float,双精度浮点数
使用type可以查看数据类型:
1 | type(3) --> number |
变量
Lua是动态语言,变量无需声明便可使用,未赋值的变量其返回值为nil
Lua中值为nil的变量,默认情况下完全等同于未定义变量
当赋值nil给某变量时,可能会使得该变量的原值被GC
Lua变量赋值时,总是先计算等号右边的值,计算完成后才开始赋值操作
Lua支持多重赋值:
1
2
3
4
5
6
7
8a = 1
a, b = 1, 2
a, b, c = 1, 2 -- c = nil
a, b, c = 1, 2, 3, 4 -- 4被忽略
a, b, _ = 1, 2, 3 -- 3被赋值给哑变量,即认为3这个值是不要的
a, b = b, a -- 变量交换
a = nil -- a原来的值1将等待被GCLua中只有全局变量和局部变量的概念,局部变量使用local关键字来声明,此外某些语句块(比如while/for)的控制变量也是局部变量
Lua中的变量是变量名指向数据值,例如
a,b=123,"hello"
,是a --> 123, b --> "hello"
布尔值
Lua中,只有nil和false两个值是False,其它所有值都是True,包括空字符串””、数值0,均为true。
Lua支持not and or
三种布尔运算符(没有对应的 ! && ||
),其中not优先级较高,而and和or优先级几乎是所有运算符中最低的。
not
总是返回布尔值:
1 | not "" -- false |
and
和or
将短路运算,且返回能做出布尔运算结论时的值:
1 | 4 and 5 --> 5 |
此外,a and b or c
绝大多数时候等价于三目运算a ? b : c
,但前提是b不能为false。当b为true时:
- 如果a为真,b为真,则a and b返回b,b or c又返回b
- 如果a为假,则a and b返回a,a or c返回c
当b为false时,如果a为true,则a and b返回b,b or c无法保证返回b,所以无法等价于a ? b : c
。
大小比较
Lua中的比较运算符有:
1 | < > <= >= == ~= --> ~=是不等于比较 |
对于< <= > >=
来说,只允许相同的两种数据类型进行比较,且默认只支持数值类型的比较和字符串类型的比较。
1 | 3 > 2 --> true |
对于== ~=
来说,支持不同类型的比较,当比较非数值和非字符串时,它们比较的是引用地址,即面向对象中的”是否是同一个对象”。
1 | 3 == 3.0 --> true |
注意,nil参与比较时,它只和nil自身相等。
1 | nil == nil --> true |