L03. 数据类型

一. Lua语言中共8种数据类型

   [1] nil            空。最简单,有且仅有值nil,表示一个无效值(在条件表达式中相当于false)

  [2] boolean  布尔。包含两个值:false和true

  [3] number   数字。double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)

  [4] string      字符串。字符串由一对双引号或单引号或[[ ]]来表示

  [5] function     函数。由C或Lua编写的函数

  [6] userdata    自定义类型。表示任意存储在变量中的C数据结构

  [7] thread      线程。表示执行的独立线程,用于执行协同程序

  [8] table      表。Lua中的表(table)其实是一个“关联数组”(associative arrays),数组的索引可以是数字或者是字符串。

  在Lua里,table的创建是通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。

 

二. type(参数),判断数据的数据类型

-[[
    type判断类型
    语法: 
        type(参数)
    功能: 
        判断参数的类型
    参数: 
        参数: 任意类型
    返回值:
        字符串型, "nil", "number", "string", "boolean", "table", "function", "thread", "userdata"返回其中的一个
--]]
print(type("Good Good Study"))  --> string
--不管是整型还是双精度浮点型,使用 type() 函数来取其类型,都会返回的是number
print(type(12.34))              --> number
print(type(print))              --> function
print(type({}))                 --> table
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string

 

三. nil类型

  1. nil类型表示一种没有任何有效值,它只有一个值nil。例如:打印一个没有赋值的变量,结果为nil值

  2. 当想要移除一个变量时,只需要将该变量名赋值为nil, 垃圾回收就会会释放该变量所占用的内存

 

四. boolean类型

  1.  boolean 类型具有两个值, true  false  boolean 类型一般被用来做条件判断的真与假,只会将 false 和 nil 视为假,其他的都视为真,特别是在条件表达式中0 和空字符串都会认为是真

print(0 == false)               --输出结果: false

if 0 then
    print("5 is true")          --输出这条语句
else
    print("5 is false")
end 

--b为nil,nil和false都是不成立
if(0 and b) then
    print("0 and b is true")
else
    print("0 and b id false")   --输出这条语句
end

if "" then
    print("nil is true")       --输出这条语句
else print("nil is false") end

 

五. number类型

 

六. string类型

  6. 字符串中的转义字符(下面只是其中一部分)

print("one line\nnext line\n\"in quotes\", 'in quotes'")
print('a backslash inside quotes: \'\\\'')
print("a simpler way: '\\'")

      ①也可以使用"\"+数值的转义来表示字符, 数值最多由3位数组成

print("\10")            --表示换号与\n一样
print("\97\1001")       --输出结果: ad1
print("\65\66\100")     --输出结果: ABd

      ②在字符串中转义十六进制数值表示的字符"\"+两个十六进制数,十六进制数值必须由两个且必须是两个十六进制数字组成

print("\x41")           --输出结果: A
--在ascll编码的系统中下面的两个表达式是等价的
print("ALO\n123\"")
print('\x41LO\10\04923"')
--把上述字符串全部改为十六进制,来表示字符串中的每一个字符
print('\x41\x4c\x4f\x0a\x31\x32\x33\x22')

    ③可以使用转义序列\u{h...h}来声明UTF-8字符,花括号中可以支持任意有效的十六进制

print("\u{3b1} \u{3b2} \u{6211}")   --输出结果: α β 我

    ④ 在表示多行[[ ]]的字符串中转义序列不会被转义

    

    \z转义字符,会跳过其后的所有空白字符,直到遇到第一个非空白字符(一行字符串分成两行写)

--下面的代码是换行(一行内容分成两行写但是代码中的效果是一行)
data2 = "\65\z      
         123"
print(data2)    --输出结果: A123(中间不会有换行符)

 

七. table类型

  1. 表的值置为nil,表示移除索引或键名

  2. 计算数组长度:  "#"和"table.pack"

local a = {1,nil,3,4,key="密钥"}
a["key"] = nil          --使用下标方式修改值
a.key = nil             --使用字典方式修改值

--当我们定义table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。
--如果 a 设置为 nil ,则 b 也能能访问 table 的元素,因为并没有改变b保存的内存地址。
--如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。
local tab1 = {1,2,key=123,[3] = 3,["val"] = 5}
local tab2 = tab1
tab1 = nil 
--tab2依然能够访问表,因为只是tab1这个变量改变了,而tab2还是指向的是表的内存地址
for k,v in pairs(tab2) do 
    print(k,v)
end

--计算数组长度"#"和"table.pack"
print(#{1,2,3,4,5,6})    --仅计算数组长度
local a = table.pack(1,2,3,4,5,6,"")   --打包成数组
print(a.n)           --数组长度 n表示这个数组的最大值

 

八. function类型

 

posted @ 2022-09-08 16:26  小书臣  阅读(62)  评论(0编辑  收藏  举报