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")
### Lua基础语法概述 Lua 是一种轻量级脚本语言,具有简单而强大的特性。以下是关于 Lua 的基本语法介绍: #### 变量与数据类型 Lua 支持八种原生数据类型[^2],其中包括四种简单的变量类型(`nil`, `number`, `string`, 和 `boolean`),以及四种复杂的变量类型(`table`, `function`, `thread`, 和 `userdata`)。 - **Nil**: 表示无值的状态。 - **Number**: 用于表示整数和浮点数。 - **String**: 字符串可以通过双引号或单引号定义。 - **Boolean**: 包含两个值:`true` 和 `false`。 例如: ```lua a = nil -- Nil 类型 b = 10 -- Number 类型 c = "Hello" -- String 类型 d = true -- Boolean 类型 ``` #### 关键字 Lua 中的关键字列表如下[^3],这些关键字不能被用作变量名或其他标识符名称: - `and`, `break`, `do`, `else`, `elseif`, `end`, `false`, `for`, `function`, `if`, `in`, `local`, `nil`, `not`, `or`, `repeat`, `return`, `then`, `true`, `until`, `while`, `goto`. #### 字符串操作 字符串的操作是 Lua 编程中的重要部分之一。通过内置的 `string` 库可以实现各种字符串处理功能。例如,使用 `string.sub()` 函数可以从指定位置提取子字符串[^1]。 代码示例: ```lua print(string.sub("Hello Lua", 4, 7)) --> 输出 'lo Lu' print(string.sub("Hello Lua", 2)) --> 输出 'ello Lua' print(string.sub("Hello Lua", -3, -1)) --> 输出 'ua' ``` #### 函数定义 函数在 Lua 中既可以作为普通的语句块存在,也可以作为一个表达式的返回值。匿名函数通常用于回调或者闭包场景中[^4]。 示例代码展示如何创建并调用带参数的函数: ```lua -- 定义一个加法器函数 function add(a, b) return a + b end result = add(5, 3) -- 调用该函数并将结果赋给 result print(result) --> 输出 8 ``` 对于更高级的应用场合,则可能涉及嵌套函数甚至闭包结构的设计思路。下面是一个利用闭包特性的实例演示: ```lua function createCounter(startValue) local count = startValue or 0 -- 初始化计数值,默认为零 return function() count = count + 1 -- 更新内部状态 return count -- 返回当前计数值 end end counterA = createCounter(10) -- 创建基于初始值 10 的计数器 A print(counterA()) --> 输出 11 print(counterA()) --> 输出 12 ``` --- #### 控制流语句 控制流程主要包括条件判断 (`if`)、循环迭代(`for`, `while`)等逻辑构建单元。这里给出几个典型片段供参考学习: ##### 条件分支 ```lua value = 5 if value > 0 then print("Positive number") --> 当 value>0 执行此条目 elseif value == 0 then print("Zero") else print("Negative number") end ``` ##### 循环遍历 ```lua for i=1,5 do -- 数值范围内的固定次数执行动作 print(i) end --> 分别输出 1 到 5 i = 1 -- 使用 while 实现相同效果 while i <= 5 do print(i) i = i + 1 -- 自增操作不可遗漏 end ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值