Lua 的 type 函数

Lua中type函数详解

Lua 的 type 函数 是一个内置函数,用于获取给定值的类型信息。该函数接受一个参数并返回表示该参数类型的字符串。

type 函数的语法如下:

type(variable)

它会返回以下可能的类型字符串之一:

  1. "nil" - 表示变量为 nil
  2. "number" - 表示数值类型(包括整数和浮点数)
  3. "string" - 表示字符串类型
  4. "boolean" - 表示布尔类型(truefalse
  5. "table" - 表示表类型
  6. "function" - 表示函数类型
  7. "thread" - 表示协程
  8. "userdata" - 表示用户自定义数据

使用示例:

print(type(42))         --> "number"
print(type("Hello"))    --> "string"
print(type(true))       --> "boolean"
print(type(print))      --> "function"
print(type({}))         --> "table"
print(type(nil))        --> "nil"

注意事项:

  • type 函数总是返回字符串,即使检查的是 nil
  • Lua 不区分整数和浮点数,统一返回 "number"
  • 对于自定义类型(通过 C API 创建),会返回 "userdata"
  • type 函数在 Lua 5.1 到 Lua 5.4 中的行为是一致的

应用场景:

  1. 类型检查:在函数参数验证时使用
  2. 调试:快速查看变量类型
  3. 序列化:根据类型进行不同的序列化处理
  4. 元编程:动态处理不同类型的数据
<think>我们被要求提供Lua所有内置函数的列表。根据引用内容,我们可以整理出Lua标准库中的内置函数,同时注意引用中提到了魔兽世界中的一些扩展(如BitLib),但我们要区分标准Lua和扩展库。 Lua标准库中的内置函数可以分为多个模块,如基础函数、字符串处理、表处理、数学运算、操作系统、调试等。我们这里主要关注基础函数(即全局作用域中的函数)以及一些核心库函数。 根据引用[3]和引用[5]以及其他引用,我们可以整理如下: ### 一、基础函数(全局作用域) 1. **`assert(v[, message])`**: 如果`v`为假(false或nil),则引发错误;否则返回所有参数。可选的`message`用于指定错误信息。 2. **`collectgarbage(opt[, arg])`**: 控制垃圾回收器(引用[3]提到在1.10.1新增)。 3. **`error(message[, level])`**: 抛出错误信息,`level`指示错误位置(1为当前函数,2为调用当前函数函数,以此类推)。 4. **`getfenv([f])`**: 返回函数`f`(或数字表示的堆栈层级)的环境。在Lua5.2中已移除。 5. **`getmetatable(object)`**: 返回对象的元表,如果没有元表则返回nil。 6. **`ipairs(t)`**: 返回迭代器函数、表`t`和0,用于遍历从1开始的连续整数索引。 7. **`loadstring(string[, chunkname])`**: 将字符串作为Lua代码块加载并返回函数(引用[3])。在Lua5.2中,`loadstring`被`load`取代。 8. **`next(table[, index])`**: 返回表的下一个键值对,用于遍历表。 9. **`pairs(t)`**: 返回迭代器函数(`next`)、表`t`和nil,用于遍历表的所有键值对。 10. **`pcall(f, arg1, ...)`**: 以保护模式调用函数`f`,捕获任何错误。返回布尔值表示成功与否,以及函数返回的结果或错误信息。 11. **`print(...)`**: 打印参数到标准输出(注意:不是标准库的一部分,但通常存在)。 12. **`rawequal(v1, v2)`**: 在不调用元方法的情况下比较两个值是否相等。 13. **`rawget(table, key)`**: 在不调用元方法的情况下获取表元素。 14. **`rawset(table, key, value)`**: 在不调用元方法的情况下设置表元素。 15. **`select(index, ...)`**: 如果`index`是数字,则返回第`index`个参数之后的所有参数;如果`index`是字符串"#",则返回参数总数。 16. **`setfenv(f, table)`**: 设置函数`f`(或堆栈层级)的环境。在Lua5.2中已移除。 17. **`setmetatable(table, metatable)`**: 设置表的元表。 18. **`tonumber(e[, base])`**: 将值转换为数字,可指定进制(2~36)。 19. **`tostring(v)`**: 将值转换为字符串。 20. **`type(v)`**: 返回值的类型名称("nil", "number", "string", "boolean", "table", "function", "thread", "userdata")。 21. **`unpack(list[, i[, j]])`**: 返回表中的元素(从`i`到`j`,默认整个表)。在Lua5.2中,`unpack`被移到`table.unpack`。 22. **`xpcall(f, msgh, arg1, ...)`**: 类似`pcall`,但可以设置错误处理函数`msgh`。 ### 二、表处理函数(table库) 在引用[2]中提到了表函数,但要注意其中一些(如`foreach`, `foreachi`, `getn`)已被废弃。标准表库函数包括: 1. **`table.concat(list[, sep[, i[, j]]])`**: 将表(数组部分)的元素连接成字符串,用`sep`分隔(默认为空),可选索引范围`i`到`j`。 2. **`table.insert(list[, pos], value)`**: 在位置`pos`插入`value`,默认在末尾插入。 3. **`table.pack(...)`**: 将参数打包成表,并添加字段`n`表示参数个数(Lua5.2新增)。 4. **`table.remove(list[, pos])`**: 移除并返回位置`pos`的元素,默认移除最后一个元素。 5. **`table.sort(list[, comp])`**: 对数组部分排序,`comp`是可选比较函数。 6. **`table.unpack(list[, i[, j]])`**: 同`unpack`(Lua5.2中`unpack`被移到`table`库)。 ### 三、字符串处理(string库) 字符串库函数很多,这里只列部分: 1. `string.byte(s[, i[, j]])` 2. `string.char(...)` 3. `string.format(formatstring, ...)` 4. `string.len(s)` 5. `string.lower(s)` 6. `string.upper(s)` 7. `string.rep(s, n)` 8. `string.reverse(s)` 9. `string.sub(s, i[, j])` 10. `string.find(s, pattern[, init[, plain]])` 11. `string.match(s, pattern[, init])` 12. `string.gmatch(s, pattern)` 13. `string.gsub(s, pattern, repl[, n])` ### 四、数学库(math库) 1. `math.abs(x)` 2. `math.acos(x)` 3. `math.asin(x)` 4. `math.atan(x)` 5. `math.atan2(y, x)` 6. `math.ceil(x)` 7. `math.cos(x)` 8. `math.cosh(x)` 9. `math.deg(x)` 10. `math.exp(x)` 11. `math.floor(x)` 12. `math.fmod(x, y)` 13. `math.log(x[, base])` 14. `math.max(x, ...)` 15. `math.min(x, ...)` 16. `math.modf(x)` 17. `math.pow(x, y)` 18. `math.rad(x)` 19. `math.random([m[, n]])` 20. `math.randomseed(x)` 21. `math.sin(x)` 22. `math.sinh(x)` 23. `math.sqrt(x)` 24. `math.tan(x)` 25. `math.tanh(x)` ### 五、操作系统(os库) 1. `os.clock()` 2. `os.date([format[, time]])` 3. `os.difftime(t2, t1)` 4. `os.execute([command])` 5. `os.exit([code[, close]])` 6. `os.getenv(varname)` 7. `os.remove(filename)` 8. `os.rename(oldname, newname)` 9. `os.setlocale(locale [, category])` 10. `os.time([table])` 11. `os.tmpname()` ### 六、调试库(debug库) 1. `debug.debug()` 2. `debug.getfenv(o)` 3. `debug.gethook([thread])` 4. `debug.getinfo([thread,] f [, what])` 5. `debug.getlocal([thread,] f, local)` 6. `debug.getmetatable(object)` 7. `debug.getregistry()` 8. `debug.getupvalue(f, up)` 9. `debug.setfenv(o, table)` 10. `debug.sethook([thread,] hook, mask [, count])` 11. `debug.setlocal([thread,] level, local, value)` 12. `debug.setmetatable(object, table)` 13. `debug.setupvalue(f, up, value)` 14. `debug.traceback([thread,] [message [, level]])` ### 七、其他 在引用[5]中提到了魔兽世界中的位运算库(BitLib),这不是标准Lua的一部分,但如果你在使用魔兽世界的API,则可以使用: 1. `bit.bnot(a)` 2. `bit.band(w1, ...)` 3. `bit.bor(w1, ...)` 4. `bit.bxor(w1, ...)` 5. `bit.lshift(a, b)` 6. `bit.rshift(a, b)` 7. `bit.arshift(a, b)` 8. `bit.mod(a, b)` ### 注意事项 - 不同Lua版本(5.1, 5.2, 5.3, 5.4)函数可能有变化。例如,Lua5.2移除了`getfenv`和`setfenv`,增加了`_ENV`。 - `os.execute`和`io.popen`的区别:`os.execute`执行命令并返回状态码,而`io.popen`执行命令并返回一个文件句柄用于读取命令输出。 以上是Lua内置函数的主要列表。由于篇幅限制,每个函数没有详细展开,但提供了基本功能描述。 §§相关问题§§ 1. Lua 5.3和5.4版本有哪些新增函数? 2. 如何在Lua中实现面向对象编程? 3. Lua的元表(metatable)和元方法(metamethod)有哪些? 4. Lua中如何管理内存和避免内存泄漏?</think>### Lua 内置函数全解析 Lua 的内置函数分为核心库和标准库,以下是分类整理(基于 Lua 5.4 版本): --- #### **一、基础函数(全局作用域)** 1. **`assert(v [, message])`** - 验证条件:若 `v` 为假(`false`/`nil`)则抛出错误,`message` 为可选错误信息[^3]。 ```lua assert(type(x) == "number", "x 必须是数字") ``` 2. **`collectgarbage(opt [, arg])`** - 控制垃圾回收器行为,`opt` 为操作指令(如 `"collect"` 强制回收)[^3]。 3. **`error(message [, level])`** - 抛出错误,`level` 指定错误堆栈层级(默认为 1)[^3]。 4. **`getmetatable(object)`** - 返回对象的元表(若无则返回 `nil`)[^3]。 5. **`ipairs(t)`** - 迭代数组部分(连续整数索引),返回索引和值[^2]。 ```lua for i, v in ipairs({"a", "b"}) do print(i, v) end --> 1 a, 2 b ``` 6. **`next(table [, index])`** - 遍历表的键值对,`index` 为起始键[^3]。 7. **`pairs(t)`** - 迭代表的所有键值对(包括非整数索引)[^2]。 8. **`pcall(f, arg1, ...)`** - 保护模式调用函数,捕获错误(返回状态码和结果/错误信息)[^3]。 ```lua local ok, result = pcall(function() error("test") end) ``` 9. **`select(index, ...)`** - 返回从 `index` 开始的参数,或参数总数(`index` 为 `"#"` 时)[^3]。 10. **`setmetatable(table, metatable)`** - 设置表的元表[^3]。 11. **`tonumber(e [, base])`** - 将值转为数字,`base` 指定进制(2~36)[^3]。 12. **`tostring(v)`** - 将值转为字符串[^3]。 13. **`type(v)`** - 返回值的类型名(如 `"number"`、`"table"`)[^3]。 14. **`xpcall(f, msgh, arg1, ...)`** - 增强版 `pcall`,`msgh` 为错误处理函数[^3]。 --- #### **二、表处理函数 (`table` 库)** 1. **`table.concat(list [, sep [, i [, j]]])`** - 连接数组元素为字符串,`sep` 为分隔符。 2. **`table.insert(list [, pos], value)`** - 插入元素到数组(`pos` 默认为末尾)[^2]。 3. **`table.pack(...)`** - 将参数打包成表(含 `n` 字段记录参数数量)。 4. **`table.remove(list [, pos])`** - 移除并返回元素(`pos` 默认为末尾)[^2]。 5. **`table.sort(list [, comp])`** - 排序数组,`comp` 为自定义比较函数[^2]。 ```lua table.sort({3,1,2}, function(a,b) return a>b end) --> {3,2,1} ``` 6. **`table.unpack(list [, i [, j]])`** - 解包表为多个返回值(等价于 `unpack`)[^3]。 --- #### **三、字符串处理 (`string` 库)** 1. **`string.byte(s [, i [, j]])`** - 返回字符的 ASCII 码。 2. **`string.char(...)`** - 将 ASCII 码转为字符。 3. **`string.format(formatstring, ...)`** - 格式化字符串(类似 `printf`)。 4. **`string.gmatch(s, pattern)`** - 返回匹配模式的迭代器。 5. **`string.gsub(s, pattern, repl [, n])`** - 全局替换字符串,`n` 指定替换次数。 6. **`string.match(s, pattern [, init])`** - 返回第一个匹配的子串。 7. **`string.reverse(s)`** - 反转字符串。 --- #### **四、数学函数 (`math` 库)** 1. **`math.abs(x)`** 2. **`math.floor(x)`** / **`math.ceil(x)`** 3. **`math.max(x, ...)`** / **`math.min(x, ...)`** 4. **`math.random([m [, n]])`** - 生成随机数(范围 `[m, n]`)。 5. **`math.sqrt(x)`** 6. **`math.sin(x)`** / **`math.cos(x)`** / **`math.tan(x)`** --- #### **五、操作系统交互 (`os` 库)** 1. **`os.clock()`** - 返回程序使用的 CPU 时间(秒)。 2. **`os.date([format [, time]])`** - 格式化时间戳[^3]。 3. **`os.execute([command])`** - 执行系统命令[^3]。 4. **`os.getenv(varname)`** - 获取环境变量值[^3]。 5. **`os.time([table])`** - 生成时间戳[^3]。 --- #### **六、位运算 (`bit32` 库)** > 需注意:Lua 5.2+ 将位操作移至 `bit32` 库,而 WoW 等环境扩展了 `bit`[^5]。 1. **`bit32.band(...)`** - 位与操作。 2. **`bit32.bor(...)`** - 位或操作。 3. **`bit32.bxor(...)`** - 位异或操作。 4. **`bit32.lshift(x, disp)`** - 左移位。 --- #### **七、其他重要函数** 1. **`loadstring(string)`** - 加载字符串为 Lua 代码块(返回函数)[^3]。 2. **`require(modname)`** - 加载模块(标准库或自定义模块)。 > **关键说明** > - **`...` 可变参数**:通过局部表 `arg` 访问,`#arg` 获取参数数量[^1]。 > - **表遍历警告**:非连续整数索引表用 `pairs`,避免 `ipairs` 遗漏[^2][^4]。 > - **版本差异**:`unpack` 在 Lua 5.2+ 中改为 `table.unpack`;`getfenv`/`setfenv` 在 Lua 5.2+ 中被移除。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值