Lua的值与类型

Lua 是一门动态类型语言。 这意味着变量没有类型;只有值才有类型。 语言中不设类型定义。 所有的值携带自己的类型。


Lua 中所有的值都是一等公民。 这意味着所有的值均可保存在变量中、 当作参数传递给其它函数、以及作为返回值。


Lua 中有八种基本类型: nil booleannumberstringfunctionuserdatathread table。 


Nil是值 nil 的类型, 其主要特征就是和其它值区别开;通常用来表示一个有意义的值不存在时的状态。

Booleanfalsetrue 两个值的类型。 nil false 都会导致条件判断为假; 而其它任何值都表示为真。

Number代表了整数和实数(浮点数)。 number 类型有两种内部表现方式, 整数 和 浮点数。 对于何时使用哪种内部形式,Lua 有明确的规则, 但它也按需作自动转换。因此,程序员多数情况下可以选择忽略整数与浮点数之间的差异或者假设完全控制每个数字的内部表现方式。 标准 Lua 使用 64 位整数和双精度(64 位)浮点数, 但你也可以把 Lua 编译成使用 32 位整数和单精度(32位)浮点数。 以 32 位表示数字对小型机器以及嵌入式系统特别合适。(参见 luaconf.h 文件中的宏 LUA_32BITS 。)

String表示一个不可变的字节序列。Lua 对 8 位是友好的: 字符串可以容纳任意8 位值, 其中包含零 ('\0') 。 Lua 的字符串与编码无关; 它不关心字符串中具体内容。

Lua 可以调用(以及操作)用 Lua 或 C 编写的函数。 这两种函数有统一类型function

userdata类型允许将 C 中的数据保存在 Lua 变量中。 用户数据类型的值是一个内存块, 有两种用户数据: 完全用户数据 ,指一块由 Lua 管理的内存对应的对象;轻量用户数据 ,则指一个简单的 C 指针。 用户数据在Lua 中除了赋值与相等性判断之外没有其他预定义的操作。 通过使用元表 程序员可以给完全用户数据定义一系列的操作。 你只能通过C API 而无法在 Lua 代码中创建或者修改用户数据的值, 这保证了数据仅被宿主程序所控制。

thread类型表示了一个独立的执行序列,被用于实现协程 Lua 的线程与操作系统的线程毫无关系。 Lua 为所有的系统,包括那些不支持原生线程的系统,提供了协程支持。

table是一个关联数组, 也就是说,这个数组不仅仅以数字做索引,除了nil和 NaN 之外的所有 Lua 值 都可以做索引。 (Not a Number是一个特殊的数字,它用于表示未定义或表示不了的运算结果,比如0/0。) 


可以是异构的; 也就是说,表内可以包含任何类型的值( nil 除外)。任何键的值若为 nil 就不会被记入表结构内部。 换言之,对于表内不存在的键,都对应着值nil 表是 Lua 中唯一的数据结构, 它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。 对于记录,Lua 使用域名作为索引。 语言提供a.name 这样的语法糖来替代 a["name"] 这种写法以方便记录这种结构的使用。 在 Lua 中有多种便利的方式创建表我们使用序列这个术语来表示一个用 {1..n} 的正整数集做索引的表。 这里的非负整数n 被称为该序列的长度和索引一样,表中每个域的值也可以是任何类型。 需要特别指出的是:既然函数是一等公民,那么表的域也可以是函数。 这样,表就可以携带方法索引一张表的原则遵循语言中的直接比较规则。 当且仅当i j 直接比较相等时 (即不通过元方法的比较), 表达式 a[i] a[j] 表示了表中相同的元素。 特别指出:一个可以完全表示为整数的浮点数和对应的整数相等(例如:1.0 == 1)。 为了消除歧义,当一个可以完全表示为整数的浮点数做为键值时, 都会被转换为对应的整数储存。 例如,当你写a[2.0] =true时, 实际被插入表中的键是整数 2 。 (另一方面,2 与 "2" 是两个不同的 Lua 值, 故而它们可以是同一张表中的不同项。)


表、函数、线程、以及完全用户数据在 Lua 中被称为对象: 变量并不真持有 它们的值,而仅保存了对这些对象的 引用。 赋值、参数传递、函数返回,都是针对引用而不是针对值的操作, 这些操作均不会做任何形式的隐式拷贝。库函数type 用于以字符串形式返回给定值的类型。


参考《Lua 5.3 manual》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值