Lua数据类型

Lua 语言

数据类型

Lua 有以下数据类型:

  • nil:表示一个无效值,相当于 NULL。
  • boolean:true 或 false。
  • number:整数或浮点数。
  • string:字符串。
  • function:函数。
  • userdata:用户数据。
  • thread:线程。
  • table:表。

nil

nil 表示一个无效值,相当于 NULL。

一个变量在第一次赋值前的默认值是 nil。

lua 复制代码
local x = nil
print(x) -- nil
print(nil) -- nil

boolean

boolean 类型只有 true 和 false 两个值。

Lua 中 nil 和 false 为"假",其它所有值均为"真"。比如 0 和空字符串("") 就是"真" 。

lua 复制代码
print(true) -- true
print(false) -- false
print(nil) -- nil
print(123) -- true

number

number 类型可以表示整数或浮点数。

可以使用数学函数 math。

floor(向下取整) 和 math.ceil(向上取整) 进行取整操作

底层实现:一般地,Lua 的 number 类型就是 C/C++中的 long long int 或 double

类型来实现的 ( Standard Lua uses 64-bit integers and double-precision ( 64-bit) floats )。

语法结构的简单是付出空间代价换来的。

lua 复制代码
print(123) -- 123
print(3.14) -- 3.14

string

string 类型用来表示文本。

使用一对匹配的单引号。

Lua 中没有字符类型,所谓的字符类型也是含有一个字符的字符串而己。

字符串还可以用一种长括号(即[[ ]]) 括起来的方式定义。其好处就在于: 1 -> 转义

并不展开(此举,跟 C++11 中 R"(hello lua)"相似) , 2 -> 便于多行书写。

Lua 中的字符串没有[]下标的概念。

=\[ \]=\]等号两侧不可以用空格,主要起到层级/配对的作用。 ```lua print("Hello, world!") -- Hello, world! print('Hello, world!') -- Hello, world! print([[Hello, world!]]) -- Hello, world! print("Hello" .. "world!") -- Helloworld! print("Hello" .. " " .. "world!") -- Hello world! ``` ## function 函数,在 Lua 中也是一种数据类型 function 类型用来表示函数。 函数可以存储在变量中,可以通过作参数传递给其他函数,还可以作为其他函数的返 回值。其上行为同普通变量无异 ```lua function add(a, b) return a + b end print(add(1, 2)) -- 3 ``` 有名函数的定义本质上是:匿名函数对变量的赋值。为说明这一点,其如下写法也是 合法的。 ```lua function foo() end 等价于 foo = function () end 类似的 local function foo() end 等价于 local foo = function () end ``` 函数入参无类型/返值无限制 ```lua function hello(a, b) print("a:", type(a), "b:", type(b)) print(a, b) return 1, 2, 3, 4, 5 end ``` ## userdata userdata 类型用来表示用户数据。 ```lua -- 创建一个 userdata local obj = {} -- 给 userdata 设置元表 setmetatable(obj, { __add = function(a, b) return a.value + b.value end }) -- 设置 userdata 的值 obj.value = 10 -- 调用 userdata 的元方法 print(obj + obj) -- 20 ``` ## thread thread 类型用来表示线程。 ```lua -- 创建一个线程 local thread = coroutine.create(function() for i = 1, 10 do print(i) coroutine.yield() end end) -- 启动线程 coroutine.resume(thread) -- 等待线程结束 coroutine.status(thread) -- dead ``` ## table Table 类型中一种基于 k-v 类型,实现了一种抽象的 "map\"。"map\"是 一种具有特殊索引方式的数组 table 类型用来表示表。 索引 k 通常是字符串(string) 或者 number 类型,但也可以是除 nil 以外的任意类型 的值。 v 则可以是 lua 中的任意类型 对于无 key 的类型,此时的 key 类型为 number,下标从 1 开始,下标依次累加。 ```lua -- 创建一个空表 local t = {} -- 给表设置字段 t.name = "Alice" t.age = 25 -- 访问表的字段 print(t.name) -- Alice print(t.age) -- 25 -- 创建一个有初始值的表 local t2 = {name = "Bob", age = 30} -- 遍历表 for k, v in pairs(t2) do print(k, v) end -- 输出: -- name Bob -- age 30 local arr = {1, 2, 3, 4, 5, 6, 7, 8} for i = 1, 8 do print(arr[i]) end ``` ```lua local corp = { web = "www.edu.nzhsoft.cn", -- k = "web" -- v = "edu.nzsoft.cn" telephone = "17090078295", -- k = "telephone" -- v = "17090078295" staff = {"jack","Scott","Gary"}, 10086, -- key = 1 v = 10086 10010, -- key = 2 v = 10010 [10] = 160, -- key = 10 v = 160 ["city"] = "guangzhou" } print(corp.web) -->output:edu.nzsoft.cn print(corp["telephone"]) -->output:17090078295 print(corp[2]) -->output:100191 print(corp["city"]) -->output:"Beijing" print(corp.staff[1]) -->output:Jack print(corp[10]) -->output:360 ```

相关推荐
枫叶丹42 小时前
【Qt开发】Qt窗口(九) -> QFontDialog 字体对话框
c语言·开发语言·数据库·c++·qt
海上彼尚2 小时前
Go之路 - 7.go的结构体
开发语言·后端·golang
源代码•宸7 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
云和数据.ChenGuang8 小时前
PHP-FPM返回的File not found.”的本质
开发语言·php·运维工程师·运维技术
R.lin8 小时前
Java 8日期时间API完全指南
java·开发语言·python
yangpipi-8 小时前
《C++并发编程实战》 第4章 并发操作的同步
开发语言·c++
火钳游侠8 小时前
java单行注释,多行注释,文档注释
java·开发语言
有趣的我9 小时前
C++ 多态介绍
开发语言·c++
fie88899 小时前
波束赋形MATLAB代码实现
开发语言·matlab
丘狸尾9 小时前
gradio uv无法add
开发语言·python