Lua-数据类型

概况

类型 描述
nil 只有值 nil 属于该类,在条件表达式中相当于 false
boolean true 或 false
number 双精度浮点数
string 字符串,通过单引号或者双引号来表示
function C 或者 Lua 函数
userdata 存储在任意变量中的 C 数据结构
thread 执行的独立线路
table 一个关联数组,索引可以为 number,string 或者 table。table 的创建通过构造表达式,最简单为 {},即为空表。

nil

  • nil 表示没有一个有效值;
  • 可以使用 nil 给全局变量或者 table 赋值代表删除;
  • 比较时用双引号。

boolean

只有 false 与 nil 为假。其余(包括0)为真。

number

默认只有一种 number 类型 - double(可以在 luaconf.h 更改定义)。

string

  • 通过单引号或者双引号来表示;
  • 也可以使用[[]]来表示一块字符串;
    1
    2
    3
    4
    5
    6
    7
    8
    html = [[
    <html>
    <head></head>
    <body>
    <a href="http://www.runoob.com/">菜鸟教程</a>
    </body>
    </html>
    ]]
  • 在对数字字符串进行算术操作时,Lua 会将其转化为数字;
    1
    2
    3
    4
    5
    6
    7
    8
    print("2" + 6)
    -- 8.0
    print("2" + "6")
    -- 8.0
    print("2 + 6")
    -- 2 + 6
    print("-2e2" * "6")
    -- -1200.0
  • 字符串连接使用..
    1
    2
    print("abc".."def")
    -- abcdef
  • 计算长度使用#
    1
    2
    3
    len = "robber.ltd"
    print(#len)
    -- 10

    table

  • Lua 中,table 的创建是通过”构造表达式”来完成的。{}是最简单的构造表达式,用来创建空表。也可以添加数据,直接初始化表;
    1
    2
    local tab1 = {}
    local tab2 = {"one","two","three","four"}
  • Lua 中的 table 是一个关联数组,索引可以是 number 或者 string;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    tab = {}
    tab["key"] = value
    key = 10
    tab[key] = 22
    tab[key] = tab[key] + 22
    for k, v in pairs(tab) do
    print(k .. " : " .. v);
    end
    --[[
    key : value
    10 : 44
    --]]
  • 不同于其他语言,Lua 将表的初始索引设置为 1(就很烦呐);
  • table 不会固定长度,当有新数据添加时自动增长,没初始化的 table 都是 nil。

function

  • 在 Lua 中,函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function func1(n)
    if n == 0 then
    return 1
    else
    return n * func1(n - 1)
    end
    end

    print(func1(5))
    -- 120
    func2 = func1
    print(func2(5))
    -- 120
  • function 可以以匿名函数(anonymous function)的方式通过参数传递:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function testFun(tab,fun)
    for k ,v in pairs(tab) do
    print(fun(k,v));
    end
    end

    tab={key1="val1",key2="val2"};
    testFun(tab,
    function(key,val)--匿名函数
    return key.."="..val;
    end
    );
  • function 可以实现多个返回值,其返回匹配串的”开始与结束下标”
    1
    2
    3
    4
    5
    6
    7
    function ReturnText()
    return 10,20,30
    end

    a,b,c=ReturnText()
    print(a,b,c)
    -- 10 20 30
  • 可变参数
    Lua中在函数参数列表中使用三点(…) 表示函数有可变的参数。Lua 将参数放在一个叫 arg 的表中,#arg 代表传入的参数格式。在 arg 中不仅保存了我们的参数还保存了参数的个数。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function average(...)
    local res=0
    local arg = {...}
    for k, v in pairs(arg) do
    res= res + v
    end
    print(res/#arg)
    end

    average(10)
    -- 10
    average(1,20)
    -- 10.5
    average(5,15,30)
    -- 16.666666666667

thread

在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

userdata

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