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;


可以看到,虽然都是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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值