Lua的8中数据类型

  • nil 表示无效值(条件表达式中为false)
  • boolean 布尔值(true/false)
  • number 数值型(十进制/十六进制/科学计数法/等)
  • string 字符串(”” / ‘’)
  • function 函数
  • userdata 自定义类型(脚本用户只能使用,不能对其定义)
  • thread 线程类型
  • table 表(可以通过表来创建数组、字典等复杂数据结构)

    nil

    只有值nil属于该类,在条件表达式中相当于 false
    没有赋值的变量默认为nil值
    nil在关系运算符中比较时,要注意nil 和 “nil”区别;type(xx) 返回的是类型的string形式
    1. print(x); -- nil
    2. print(x == nil); -- true
    3. print(type(x)); -- "nil"
    4. print(type(X) == nil); -- false
    5. print(type(X) == "nil");-- true

boolean

Lua将false、nil看作假;true和非nil为真

if false or nil then
    print("false、nil至少一个为真");
else
    print("false 和 nil为假");
end

if 0 then
    print("数字0 为真");
else
    print("数字0 为假");
end

-- false 和 nil为假
-- 数字0 为真

number

Lua 默认只有一种 number 类型 — double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)

print(type(2))                                    -- number 
print(type(2.2))                                -- number 
print(type(0.2))                                -- number 
print(type(2e+1))                                -- number 
print(type(0.2e-1))                            -- number 
print(type(7.8263692594256e-06))-- number

string

字符串由一对双引号或单引号来表示。也可以用 2 个方括号 “[[]]” 来表示”一块”字符串。

string1 = "this is string1";
string2 = 'this is string2';
html = [[
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]];
print(html);

table

Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。
不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始
table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。

function

Lua中,函数不支持重载,多个同名函数时,默认调用最后一个声明的函数

在 Lua 中,函数是被看作是”第一类值(First-Class Value)”,函数可以存储在变量里:

function add(n1, n2)
    return n1 + n2;
end
print(add(5, 6));   -- 11

function 可以以匿名函数(anonymous function)的方式通过参数传递:

function add(n1, n2, fun)
    local sum = n1 + n2;
    print("add函数: " .. sum);
    fun(sum);
end

function myFunc(n)
    print("myFunc函数: " .. n);
end

add(1, 2,
    function(n)
        print("myFunc函数: " .. n);
    end);
print("------------------");
add(3, 4, myFunc);

-- add函数: 3
-- myFunc函数: 3
------------------
-- add函数: 7
-- myFunc函数: 7

thread

在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

userdata

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

参考链接

[Lua虚拟机解析系列]01 Lua中的数据类型 https://zhuanlan.zhihu.com/p/98082472