• Lua基础


    一、Lua的基本数据类型源码实现

    数据类型说明
    nil表示一个无效值,相当于null
    number双精度实浮点数,相当于double
    string字符串类型,用单引号和双引号括起来
    booleanfalse true
    table数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{} ,字典
    function函数
    userdatac语言数据结构
    thread执行的独立线路,多线程

    lua语言的底层语言跟python一样,都是用C语言实现的。

    lua语言的数据结构跟python一样,大致分为两大类:不可变长度的 和 可变长度的。(区别:在创建对象之前能否确定数据的长度,64位机器下:c语言中char占1个字节, short占4个字节,int占4个字节,float占4个字节,double占8个字节)

    不可变长度的数据类型有:nil,numbr,boolean
    可变长度的数据类型有:string、table、function、thread。

    先看一下Lua中数据类型的实现

    #define CommonHeader	struct GCObject *next; lu_byte tt; lu_byte marked
    
    typedef struct GCObject {
      CommonHeader;
    } GCObject;
    
    typedef int (*lua_CFunction) (lua_State *L);
    
    //联合体,数据类型
    typedef union Value {
      struct GCObject *gc;    /* 可回收数据类型,即可变长度数据类型 */
      void *p;         /* userdata 数据 */
      lua_CFunction f; /* 函数 数据 */
      lua_Integer i;   /* int 数据 */
      lua_Number n;    /* float 数据 */
    } Value;
    
    
    //value_存放数据内容, tt_存放数据类型
    #define TValuefields	Value value_; lu_byte tt_  
    
    //一个最终的lua数据
    typedef struct TValue {
      TValuefields;
    } TValue;
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    可以看到,虽然都是C语言实现的,但Lua和Python的数据类型实现大不相同,Python用结构体struct保存,而Lua是用联合体union。

    联合体的特点是,虽然一个联合体内有多个数据,且数据类型可以不同,但他们使用的是同一个地址,所以后赋值的会覆盖掉原先的数据,即一个联合体内只能有一个数据被赋值。

    如何实现通用数据类型:使用指针强转数据类型,类似于下面的实现

    #include 
    union Value
    {
    	int a;
    	float b;
    } value;
    
    int main()
    {
    	value.a=1;
    	printf("%d\n", value.a);
    	value.b = 43534.454;
    	printf("%f", *(float *)&value.a); //强转数据类型以实现通用
    
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    二、Lua的垃圾回收机制

    Lua跟python一样,有自动回收垃圾的机制,也可以手动调用执行回收。

    Lua中的string table function thread 四种数据类型是以引用方式共享,是需要被 GC 管理回收的对象。

    Python的垃圾回收机制是:引用计数法 + 寻根法 + 年代法。

    而Lua的垃圾回收机制是用:寻根法。
    在GC开始时,它会将对象进行标记,标记为三种状态中的一种:

    状态描述
    White状态也就是待访问状态。表示对象还没有被垃圾回收的标记过程访问到。
    Gray状态也就是待扫描状态。表示对象已经被垃圾回收访问到了,但是对象本身对于其他对象的引用还没有进行遍历访问。
    Black状态也就是已扫描状态。表示对象已经被访问到了,并且也已经遍历了对象本身对其他对象的引用。

    三、Lua基础语法

    1、注释

    -- 单行注释
    
    --[[
    多行注释
    --]]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、变量

    -- 全局变量
    a = 10
    -- 局部变量
    local a = 10
    
    • 1
    • 2
    • 3
    • 4

    3、 流程控制语句

    if (条件1) then
    	dosomething....
    elseif (条件2) then
    	dosomething....
    else 
    	dosomething....
    end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4、循环语句

    --while 语句
    while (条件)
    do
    	dosomething.....
    end
    -- for 语句
    for i = start,end,step do
    	dosomething.....
    end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5、函数

    function max(num1, num2)
    	dosomething.....
    end
    
    • 1
    • 2
    • 3

    6、字符串拼接

    
    -- ...在lua中就是字符串拼接的含义
    print("hello"..."lua")
    
    • 1
    • 2
    • 3
  • 相关阅读:
    1516. 移动 N 叉树的子树 DFS
    `Algorithm-Solution` `AcWing` 903. 昂贵的聘礼
    Java中的全局变量和局部变量
    乘法器设计(流水线)verilog code
    C++并发与多线程(2) | 线程运行开始和结束的基本方式
    两个有序表的合并(三种方法)
    Linux发行版X华为鲲鹏openEuler
    张一鸣 12 万字观点整理
    17.4-8连接数据库&增删改查基本操作(血干JAVA系类)
    MQ 之 RocketMQ整合进SpringBoot项目
  • 原文地址:https://blog.csdn.net/Mou_Yang/article/details/127707447