>> >> >> Reference << << << <<<<<<Ref>>>>>>
Value&Type
Modified: 2026-02-23 | Author:ljf12825

Value

Lua是一种动态类型语言,变量本身没有类型,只有值才有类型。语言中不存在类型定义。所有值都携带自身的类型

在C/C++里

int a = 10;

变量a有类型int

但在Lua里

a = 10
a = "hello"

变量a本身没有类型,它只是“引用某个值”
真正有类型的是值

这就叫动态类型 + 值携带类型

Lua中的所有值都是一等公民,这意味着所有值都可以

Type

Lua有八种基本类型

类型说明语义
nil空值值类型
boolean布尔值类型
number数字值类型
string字符串值类型
function函数引用类型
userdata用户数据引用类型
thread协程引用类型
table引用类型

Lua的类型系统是极简的,没有类、结构体、枚举、模板,只靠table + metatable实现
弱类型会自动转换

"10" + 5  -- 会自动转number
"abc" + 1  -- 会报错

nil

类型nil只有一个值:nil

它的主要特性是与任何其他值都不同;它通常表示“没有有用的值”

表中不存在的key也是nil

if a then

nil和false都会使条件判断结果为false;它们统称为“假值(false values)”。任何其他值在条件判断中都为true(包括0和"")

尽管其名称如此,false经常被用作nil的替代值,不同之处在与

boolean

true, false

number

类型number表示整数和实数(浮点数),通过两个子类型实现

a = 10    -- 整数
b - 3,14  -- 浮点

Lua会自动区分

标准Lua使用

也可以编译Lua使其使用

这对小型机器和嵌入式系统友好

除非另有说明,整数运算发生溢出时会按照补码算术的常规规则回绕,换句话说,实际结果是
在整数类型位数为n的情况下,与数学结果在模2^n意义下相等的唯一可表示整数

Lua对每个子类型何时使用有明确规则,但也会在需要时自动在整数和浮点数之间转换
因此,程序员可以

string

a = "hello"
b = 'world'
c = [[多行字符串]]

特点:

print("10" + 20)  --> 30

function

Lua可以调用(并操作)用Lua编写的函数以及用C编写的函数,两者都由类型function表示

函数是第一类值,可以

function add(a, b)
    return a + b
end

f = add
print(f(1,2))

userdata

类型userdata用于允许任意C/C++数据存储在Lua变量中

userdata值表示一块原始内存

有两种userdata

这是给C/C++绑定用的,比如

Lua里只保存“引用”

thread

Lua的thread不是OS线程,而是协程(coroutine)

co = coroutine.create(function()
    print("hello")
end)

协程是Lua控制流的核心机制之一

table

Lua里几乎一切抽象都用table实现

t = {}
t[1] = 100
t["name"] = "ljf"

Lua的table是混合数组 + 哈希表,而且是引用类型

a = {}
b = a
b.x = 10
print(a.x) --> 10

类型转换

类型检测

type()函数是进行类型检测的唯一内置方式,它以字符串形式返回传入值的类型名称

示例

print(type(10))     --> number
print(type("abc"))  --> string
print(type({}))     --> table