美文网首页
数据类型

数据类型

作者: 爱折腾的傻小子 | 来源:发表于2020-12-31 11:24 被阅读0次

    Lua 数据类型

    • lua是动态类型语言(定义变量时不用指定变量类型)
    • lua有8个基本类型
      • nil、boolean、number、string、userdata、function、trread、table

    nil

    • 只有值nil属于该类,表示一个无效值 (在条件表达式中总返回false)
    • nil 类型表示一种没有任何有效值,它只有一个值 -- nil
    print(a)  -- nil
    print(type(a)) -- nil
    -- type获取变量类型 返回字符串
    print(type(type(a))) -- string
    
    • 对于全局变量table,nil还有一个删除的作用,给全局变量或者table表里的变量赋值nil等同于删除
    tab1 = {key1 = "val1", keys = "val2", "val3"}
    -- pairs 相当于迭代 table
    for i, v in pairs(tab1) do
        -- 字符串连接符 ..
        print(i .. " - " .. v)
    end
    --[[
        打印结果:
        1 - val3
        keys - val2
        key1 - val1
    --]]
    
    -- 删除key1
    tab1.key1 = nil
    for i, v in pairs(tab1) do
        print(i .. " - " .. v)
    end
    --[[
        打印结果:
        1 - val3
        keys - val2
    --]]
    
    
    • 使用nil作为比较需要加上双引号
    print(type(xs))             -- nil
    -- 由于 type函数的返回值是字符串类型
    print(type(xs) == nil)      -- false
    print(type(xs) == "nil")    -- true
    

    boolean

    • 布尔类型两个可选值:false、true
    • lua吧 false和nil都看作是假,其他的都是真(包括0)
    print(nil == false)     -- false
    print(0 == false)       -- false
    print(type(true))   -- boolean
    print(type(false))  -- boolean
    print(type(nil))    -- nil
    
    if 0 then
        print("0是真(true)")  -- 0是真(true)
    end
    
    if nil then
        print("nil是假(false),不会打印")
    else
       print("nil是false")   -- nil是false
    end
    
    if type(nil) or type(false) then
        print("type函数返回的是字符串,都被判断为真true")   -- type函数返回的是字符串,都被判断为真true
    end
    

    number

    • Lua默认只有一种number类型,即double双精度类型(默认类型可以修改 luaconf.h 里的定义)
    • 以下几种写法都被看作是 number 类型
    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

    • 字符串由一对双引号或单引号来表示。
    str1 = '我是字符串,用单引号表示'
    str2 = "我是字符串,用双引号表示"
    print(str1) -- 我是字符串,用单引号表示
    print(str2) -- 我是字符串,用双引号表示
    
    • 用两个方括号 "[[]]"表示"一块"字符串。
    html = [[
    <html>
    <head></head>
    <body>
    <div>一块字符串</div>
    </body>
    </html>
    ]]
    
    print(html)
    --[[
    <html>
    <head></head>
    <body>
    <div>一块字符串</div>
    </body>
    </html>
    --]]
    
    • 字符串连接 ..
    print("a" .. "b")   -- ab
    -- 注意看数字作为拼接时出现的问题
    print("a" .. "b")   -- ab
    print("a" .. "b" .. 'cd')   -- abcd
    print(182 .. 0000)          -- 1820
    print(182 .. 0000 .. 2356)  -- 18202356
    print(182 .. 0100)          -- 182100
    
    • 字符串数字做运算
    print("2" + 6)          -- 8
    print("2" + "6")        -- 8
    print("2 + 6")          -- 2 + 6
    print("-2e2" * "6")     -- -1200.0
    -- print("error" + 1)   -- 报错
    
    • # 计算字符串长度,放在字符串前面
    print(#"hello world!")  -- 12
    len = "123456789"
    print(#len)             -- 9
    print(#"你")             -- 3
    print(#"123 你好!")     -- 13
    

    table

    • 在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表
    • 可以在表里添加一些数据,直接初始化表
    -- 创建一个空的 table
    local tab11 = {}
    print(type(tab11))  -- table
    -- 直接初始化表
    local tab22 = {"l", "u", "a"}
    -- 这里打印的是地址
    print(tab22)        -- table: 0000000000379f70
    -- 注意lua的索引是从1开始的 有别于其他的语言
    print(tab22[1])     -- l
    print(tab22[2])     -- u
    print(tab22[3])     -- a
    
    • lua中table其实 "关联数组",数组的索引可以是数字或者是字符串
    aaa = {}
    aaa["key"] = "value"
    key = 20
    aaa[key] = 12
    aaa[key] = aaa[key] + 1
    for i, v in pairs(aaa) do
        print(i .. " : " .. v)
    end
    --[[
    key : value
    20 : 13
    --]]
    
    • table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil
    aaa3 = {}
    for i = 1, 10 do
        aaa3[i] = i
    end
    
    aaa3["key"] = "val"
    print(aaa3["key"])      -- val
    print(aaa3["none"])     -- nil
    for i, v in pairs(aaa3) do
        print(i .. " : " .. v)
    end
    --[[
    1 : 1
    2 : 2
    3 : 3
    4 : 4
    5 : 5
    6 : 6
    7 : 7
    8 : 8
    9 : 9
    10 : 10
    key : val
    --]]
    

    function

    • 在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里:
    -- 函数(递归函数)
    function factorial1(n)
        if n == 0 then
            return 1
        else
            return n * factorial1(n - 1)
        end
    end
    
    print(factorial1(5))    -- 120
    factorial2 = factorial1     -- 函数赋值给变量
    print(factorial2(5))    -- 120
    
    • function 可以以匿名函数(anonymous function)的方式通过参数传递:
    -- 匿名函数采用闭包形式
    function anonymous(tab, func)
        for i, v in pairs(tab) do
            print(func(i, v))
        end
    end
    
    tab33 = {key1 = "value1", key2 = "value2"}
    anonymous(tab33, function (key, val)
        return key .. " = " .. val
    end)
    --[[
    key2 = value2
    key1 = value1
    --]]
    

    thread (线程)

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

    userdata (自定义类型)

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

    8种数据类型

    数据类型 描述
    nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)
    boolean 包含两个值:false和true
    number 表示双精度类型的实浮点数
    string 字符串由一对双引号或单引号来表示
    function 由 C 或 Lua 编写的函数
    userdata 表示任意存储在变量中的C数据结构
    thread 表示执行的独立线路,用于执行协同程序
    table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表

    相关文章

      网友评论

          本文标题:数据类型

          本文链接:https://www.haomeiwen.com/subject/vythoktx.html