一、Lua的基本数据类型源码实现
数据类型 | 说明 |
---|---|
nil | 表示一个无效值,相当于null |
number | 双精度实浮点数,相当于double |
string | 字符串类型,用单引号和双引号括起来 |
boolean | false true |
table | 数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{} ,字典 |
function | 函数 |
userdata | c语言数据结构 |
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;
可以看到,虽然都是C语言实现的,但Lua和Python的数据类型实现大不相同,Python用结构体struct保存,而Lua是用联合体union。
联合体的特点是,虽然一个联合体内有多个数据,且数据类型可以不同,但他们使用的是同一个地址,所以后赋值的会覆盖掉原先的数据,即一个联合体内只能有一个数据被赋值。
如何实现通用数据类型:使用指针强转数据类型,类似于下面的实现
#include <stdio.h>
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;
}
二、Lua的垃圾回收机制
Lua跟python一样,有自动回收垃圾的机制,也可以手动调用执行回收。
Lua中的string table function thread 四种数据类型是以引用方式共享,是需要被 GC 管理回收的对象。
Python的垃圾回收机制是:引用计数法 + 寻根法 + 年代法。
而Lua的垃圾回收机制是用:寻根法。
在GC开始时,它会将对象进行标记,标记为三种状态中的一种:
状态 | 描述 |
---|---|
White状态 | 也就是待访问状态。表示对象还没有被垃圾回收的标记过程访问到。 |
Gray状态 | 也就是待扫描状态。表示对象已经被垃圾回收访问到了,但是对象本身对于其他对象的引用还没有进行遍历访问。 |
Black状态 | 也就是已扫描状态。表示对象已经被访问到了,并且也已经遍历了对象本身对其他对象的引用。 |
三、Lua基础语法
1、注释
-- 单行注释
--[[
多行注释
--]]
2、变量
-- 全局变量
a = 10
-- 局部变量
local a = 10
3、 流程控制语句
if (条件1) then
dosomething....
elseif (条件2) then
dosomething....
else
dosomething....
end
4、循环语句
--while 语句
while (条件)
do
dosomething.....
end
-- for 语句
for i = start,end,step do
dosomething.....
end
5、函数
function max(num1, num2)
dosomething.....
end
6、字符串拼接
-- ...在lua中就是字符串拼接的含义
print("hello"..."lua")