lua--从小白开始(3)

这篇为学习lua杂记。

一、关于lua源码的一些文件:

1.lua.c ——  lua解释器程序源码。

2.lua.h —— 该头文件定义了Lua提供的基础函数,包括创建Lua环境,调用Lua函数(如 lua_pcall)、读写Lua环境中全局变量,

以及注册供Lua调用的新函数等。该头文件定义所有内容都有一个“lua_”前缀。

3.luaxlib.h —— 该头文件定义了Lua辅助库提供的函数。他的所有定义都以“luaL_”为前缀(如 luaL_loadbuffer)。辅助库是一个

使用lua.h中的API编写出来的一个较高的抽象层。注:辅助库没有直接访问Lua内部,它都是官方的基础API来完成

所有工作的。

二、关于lua的一些函数:

1.luaL_newstate() —— 创建一个新的Lua环境(或状态)。当创建一个新的环境时,该环境为空,新环境中没有包含预定义的函数。

为了使Lua保持小巧,所有标准库都被组织到了不同的包中。在lualib.h中定义了打开这些库的函数。

2.luaL_openlibs (lua_State *L) —— 该函数可以打开所有的标准库。

3.luaL_loadbuffer(L,s,sz,n) —— 编译加载到Lua环境中的命令。如果没有错误,此函数返回0,并想栈中压入编译后的程序块。

4.lua_pcall(L,n,r,f)  —— 通过调用此函数,将luaL_loadbuffer()压入栈中的程序块弹出,并在保护模式中运行它。与luaL_loadbuffer

一样,该函数返回0表示没有错误。如果发生错误,那么这些函数就会向栈中压入一条错误消息。

5.lua_tostring(L,i) —— 用该函数可以获取lua_pcall调用的函数错误时向栈中压入的一条错误信息。打印后,

可以用lua_pop()把它从栈中删除。

三、关于栈的一些基础理解:

一、关于对栈操作的一些函数:

①.压栈操作函数

1.void lua_pushnil (lua_State *L) —— 向栈中压入常量nil值。

2.lua_pushnumber(lua_State *L)  ——向栈中压入双精度浮点数。

3.lua_pushinteger(lua_State *L)  —— 向栈中压入整型数。

4.lua_pushboolean(lua_State *L)  —— 向栈中压入bool变量(C语言中用整数)。

5.lua_pushlstring(lua_State *L)  —— 向栈中压入字符串(char * 及长度)。

6.lua_pushstring(lua_State *L)  —— 向栈中压入以字符零结尾的字符串。

7.int lua_checkstack(lua_State *L, int sz) —— 检查栈是否够用。

③.查询栈中元素

在Lua通讯中,向栈查询元素是通过索引(index),正索引是从第一个压入参数开始,负索引是从最后一个

压入参数开始。

1. int lua_is*(lua_State *L, int index) —— 此类函数是查询栈中元素是否是查询的类型。

需要注意的是:lua_isnumber不会检查值是否是数字类型,而是检查值是否能转换为数字类型,lua_isstring也具有

同样的行为。因此,对于任何数字,lua_isstring都返回真。

2.int lua_type (lua_State *L, int idx) —— 该函数返回战洪元素的类型。每种类型都对应一个常量,这些常量定义在头文件lua.h中。

注意:

该函数一般可用在一个switch语句中。另外,若要检查一个元素是否为真正的字符串或数字(无需转换的),也可以使用换个函数。

lua_type 返回类型常量定义如图:

3.lua_to*系类函数用于从栈中获取一个值,函数原型如图:

注:当Lua调用一个C函数返回时,Lua就会清空它的栈。所以,不要在C函数之外使用在C函数内获得的指向Lua字符串的指针。

④.其他对栈操作的函数:

1.int lua_gettop (lua_State *L) —— 该函数返回栈中元素的个数,也可以说是栈顶的索引。

2.void lua_settop (lua_State *L, int idx) —— 将栈顶设置为一个指定的位置,如果之前的栈顶比新设置的更高,那么搞出来的就被丢弃;

反之,会向栈中压入nil来不足大小。即修改栈中元素的数量。有一个特殊的调用, lua_settop (L, 0)能清空栈。在Lua中还定义了一个

特殊的宏:#define lua_pop(L,n) lua_settop(L, -(n)-1)

3.void lua_pushvalue (lua_State *L, int idx) —— 该函数会将指定索引上的值的副本压入栈。即,把堆栈上给定有效处索引处的元素作一

个拷贝压栈。

4.void lua_remove (lua_State *L, int idx)  —— 该函数删除索引上的元素,并将该索引以上的元素下移以填补空缺。

5.void lua_insert (lua_State *L, int idx) —— 该函数会上移指定位置上的所有元素以开辟一个槽的空间,然后将栈顶元素移到该位置。

6.void lua_replace (lua_State *L, int idx) —— 函数会把栈顶元素移动到给定位置(并且把这个栈顶元素弹出), 不移动任何元素(因

此在那个位置处的值被覆盖掉)。

注:

lua_settop(L,-1) 和lua_insert (L,-1)不会对栈产生影响。

lua_settop(L,-1) 为将栈顶元素设置为它当前值。

lua_insert (L,-1)为将栈顶元素移动到栈顶

希望大家多多指正,共同进步。

每天进步一点点。。。

时间: 2024-10-03 21:53:36

lua--从小白开始(3)的相关文章

【游戏开发】小白学Lua(上)

在很多游戏中,脚本语言是不可或缺的一部分,很多游戏都使用到了Lua,js,python一类的脚本,脚本语言可以在很多方面给开发进程带来帮助.脚本语言可以作为初始化文件读入变量和游戏数据的一个快速而方便的方法.它们通常因为具有节省编译时间提高生产效率.提高创造性和拓展性的有点而受到众多游戏开发厂商的青睐.在本篇博客中,马三将和大家一起学习一下Lua这门脚本语言. 一.搭建Lua运行环境 学习任何一门编程语言恐怕都是要先搭建起来它的开发环境,这样才能多写代码多练习.Lua有一个交互的解释程序(lua

【小白学Lua】之Lua变长参数和unpack函数

一.简介 Lua的变长参数和unpack函数在实际的开发中应用的还挺多的,比如在设计print函数的时候,需要支持对多个变量进行打印输出,这时我们就需要用到Lua中的变长参数和unpack函数了. 二.Lua变长参数与unpack函数 Lua中支持可变参数,用 ... 表示.比如定义下面的这样一个函数: local function func1(...) end 当然它也支持在变长参数前面添加固定参数: local function func1(var,...) --dosomething en

小白日记14:kali渗透测试--NMAP

NAMP 被认为是最强大的扫描器 所有参数 [email protected]:~# nmap Nmap 7.01 ( https://nmap.org ) Usage: nmap [Scan Type(s)] [Options] {target specification} TARGET SPECIFICATION: <strong> #目标发现</strong> Can pass hostnames, IP addresses, networks, etc. Ex: scanm

online_jf.lua --累计在线时间领取物品(积分)的lua脚本

原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 --------------------------------------------------------------惯例写在前面: 写这玩意其实学习性更大于目的性..= =研究了两天晚上写的我人参中滴第一个lua脚本,居然还真给我写出来了,好感动由于写代码的基础基本是零 所以碰了N+N次壁 什么函数字母大小写还要区分  -- 闹哪样啊喂 因为这个原因我试了半个多钟才发现问题所在什么函

Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(5): 返回指定表格中的所有键(key):table.keys

这里的函数主要用来做:返回指定表格中所有的键.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有键(key) -- example: local t = ( a = 1, b = 2, c = 3 ) local keys = table.keys( t ) -- keys = { "a", "b", "c" } -- @param t 要检查的表格(t表示是table) -- @param table

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(7): 其他table方法

看了下其他的table方法,好像没有什么好说的,注释里已经写的很明白了,这里就不罗嗦了~(小白:懒...).参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有值(value) -- example local t = { a = 1, b = 2, c = 3 } local values = table.values( t ) -- values = { 1, 2, 3 } -- @parame t 要检查的表格(t表示是table) -- @para

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(8): 生成只读table

这个函数的作用是:生成只读table. --[[ -- 生成只读table -- @param table t 需要不允许修改的table example: local tb = {"星期一", "星期二", "星期日"} local days = readOnly( tb ); days[2] = "星期三哪去了啊?" ; "[string \"Functions.lua\"]:466: 别修改

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(6): 合并表格:table.merge

这里的函数主要用来做:合并表格.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 将 来源表格 中所有键及值复制到 目标表格 对象中,如果存在同名键,则覆盖其值 -- example local tDest = { a = 1, b = 2 } local tSrc = { c = 3, d = 4 } table.merge( tDest, tSrc ) -- tDest = { a = 1, b = 2, c = 3, d = 4 } -- @param tDest 目

Lua语言基础汇总(8) -- Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那本文就是主要讲的是如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接