本篇内容主要讲解“Lua中有哪些常用函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Lua中有哪些常用函数”吧!
lua_getallocf
lua_Alloc lua_getallocf (lua_State *L, void **ud);
返回给定状态机的内存分配器函数。如果 ud
不是 NULL
,Lua 把调用lua_newstate
时传入的那个指针放入*ud
。
lua_getfenv
void lua_getfenv (lua_State *L, int index);
把索引处值的环境表压入堆栈。
lua_getfield
void lua_getfield (lua_State *L, int index, const char *k);
把 t[k]
值压入堆栈,这里的 t
是指有效索引 index
指向的值。在 Lua 中,这个函数可能触发对应 “index” 事件的元方法(参见 §2.8)。
lua_getglobal
void lua_getglobal (lua_State *L, const char *name);
把全局变量 name
里的值压入堆栈。这个是用一个宏定义出来的:
#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, s)
lua_getmetatable
int lua_getmetatable (lua_State *L, int index);
把给定索引指向的值的元表压入堆栈。如果索引无效,或是这个值没有元表,函数将返回 0 并且不会向栈上压任何东西。
lua_gettable
void lua_gettable (lua_State *L, int index);
把 t[k]
值压入堆栈,这里的 t
是指有效索引 index
指向的值,而 k
则是栈顶放的值。
这个函数会弹出堆栈上的 key (把结果放在栈上相同位置)。在 Lua 中,这个函数可能触发对应 “index” 事件的元方法(参见§2.8)。
lua_gettop
int lua_gettop (lua_State *L);
返回栈顶元素的索引。因为索引是从 1 开始编号的,所以这个结果等于堆栈上的元素个数(因此返回 0 表示堆栈为空)。
lua_insert
void lua_insert (lua_State *L, int index);
把栈顶元素插入指定的有效索引处,并依次移动这个索引之上的元素。不要用伪索引来调用这个函数,因为伪索引不是真正指向堆栈上的位置。
lua_Integer
typedef ptrdiff_t lua_Integer;
这个类型被用于 Lua API 接收整数值。
缺省时这个被定义为 ptrdiff_t
,这个东西通常是机器能处理的最大整数类型。
lua_isboolean
int lua_isboolean (lua_State *L, int index);
当给定索引的值类型为 boolean 时,返回 1 ,否则返回 0 。
lua_iscfunction
int lua_iscfunction (lua_State *L, int index);
当给定索引的值是一个 C 函数时,返回 1 ,否则返回 0 。
lua_isfunction
int lua_isfunction (lua_State *L, int index);
当给定索引的值是一个函数( C 或 Lua 函数均可)时,返回 1 ,否则返回 0 。
lua_islightuserdata
int lua_islightuserdata (lua_State *L, int index);
当给定索引的值是一个 light userdata 时,返回 1 ,否则返回 0 。
lua_isnil
int lua_isnil (lua_State *L, int index);
当给定索引的值是 nil 时,返回 1 ,否则返回 0 。
lua_isnumber
int lua_isnumber (lua_State *L, int index);
当给定索引的值是一个数字,或是一个可转换为数字的字符串时,返回 1 ,否则返回 0 。
lua_isstring
int lua_isstring (lua_State *L, int index);
当给定索引的值是一个字符串或是一个数字(数字总能转换成字符串)时,返回 1 ,否则返回 0 。
lua_istable
int lua_istable (lua_State *L, int index);
当给定索引的值是一个 table 时,返回 1 ,否则返回 0 。
lua_isthread
int lua_isthread (lua_State *L, int index);
当给定索引的值是一个 thread 时,返回 1 ,否则返回 0 。
lua_isuserdata
int lua_isuserdata (lua_State *L, int index);
当给定索引的值是一个 userdata (无论是完整的 userdata 还是 light userdata )时,返回 1 ,否则返回 0 。
lua_lessthan
int lua_lessthan (lua_State *L, int index1, int index2);
如果索引 index1
处的值小于索引 index2
处的值时,返回 1 ;否则返回 0 。其语义遵循 Lua 中的 操作符(就是说,有可能调用元方法)。如果任何一个索引无效,也会返回 0 。
lua_load
int lua_load (lua_State *L, lua_Reader reader, void *data, const char *chunkname);
加载一个 Lua chunk 。如果没有错误, lua_load
把一个编译好的 chunk 作为一个 Lua 函数压入堆栈。否则,压入出错信息。 lua_load
的返回值可以是:
0: 没有错误; LUA_ERRSYNTAX
: 在预编译时碰到语法错误;LUA_ERRMEM
: 内存分配错误。
这个函数仅仅加栽 chunk ;而不会去运行它。
lua_load
会自动检测 chunk 是文本的还是二进制的,然后做对应的加载操作(参见程序luac
)。
lua_load
函数使用一个用户提供的reader
函数来读取 chunk (参见lua_Reader
)。data
参数会被传入读取器函数。
chunkname
这个参数可以赋予 chunk 一个名字,这个名字被用于出错信息和调试信息(参见§3.8)。
lua_newstate
lua_State *lua_newstate (lua_Alloc f, void *ud);
创建的一个新的独立的状态机。如果创建不了(因为内存问题)返回 NULL
。参数 f
是一个分配器函数; Lua 将通过这个函数做状态机内所有的内存分配操作。第二个参数 ud
,这个指针将在每次调用分配器时被直接传入。
lua_newtable
void lua_newtable (lua_State *L);
创建一个空 table ,并将之压入堆栈。它等价于 lua_createtable(L, 0, 0)
。
lua_newthread
lua_State *lua_newthread (lua_State *L);
创建一个新线程,并将其压入堆栈,并返回维护这个线程的 lua_State
指针。这个函数返回的新状态机共享原有状态机中的所有对象(比如一些 table),但是它有独立的执行堆栈。
没有显式的函数可以用来关闭或销毁掉一个线程。线程跟其它 Lua 对象一样是垃圾收集的条目之一。
lua_newuserdata
void *lua_newuserdata (lua_State *L, size_t size);
这个函数分配分配一块指定大小的内存块,把内存块地址作为一个完整的 userdata 压入堆栈,并返回这个地址。
userdata 代表 Lua 中的 C 值。完整的 userdata 代表一块内存。它是一个对象(就像 table 那样的对象):你必须创建它,它有着自己的元表,而且它在被回收时,可以被监测到。一个完整的 userdata 只和它自己相等(在等于的原生作用下)。
当 Lua 通过 gc
元方法回收一个完整的 userdata 时, Lua 调用这个元方法并把 userdata 标记为已终止。等到这个 userdata 再次被收集的时候,Lua 会释放掉相关的内存。
lua_next
int lua_next (lua_State *L, int index);
从栈上弹出一个 key(键),然后把索引指定的表中 key-value(健值)对压入堆栈(指定 key 后面的下一 (next) 对)。如果表中以无更多元素,那么lua_next
将返回 0 (什么也不压入堆栈)。
典型的遍历方法是这样的:
lua_pop(L, 1); }
在遍历一张表的时候,不要直接对 key 调用 lua_tolstring
,除非你知道这个 key 一定是一个字符串。调用 lua_tolstring
有可能改变给定索引位置的值;这会对下一次调用 lua_next
造成影响。
lua_Number
typedef double lua_Number;
Lua 中数字的类型。确省是 double ,但是你可以在 luaconf.h
中修改它。
通过修改配置文件你可以改变 Lua 让它操作其它数字类型(例如:float 或是 long )。
lua_objlen
size_t lua_objlen (lua_State *L, int index);
返回指定的索引处的值的长度。对于 string ,那就是字符串的长度;对于 table ,是取长度操作符 (‘#
‘) 的结果;对于 userdata ,就是为其分配的内存块的尺寸;对于其它值,为 0 。
lua_pcall
lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
以保护模式调用一个函数。
nargs
和 nresults
的含义与 lua_call
中的相同。如果在调用过程中没有发生错误, lua_pcall
的行为和 lua_call
完全一致。但是,如果有错误发生的话, lua_pcall
会捕获它,然后把单一的值(错误信息)压入堆栈,然后返回错误码。同 lua_call
一样, lua_pcall
总是把函数本身和它的参数从栈上移除。
如果 errfunc
是 0 ,返回在栈顶的错误信息就和原始错误信息完全一致。否则,errfunc
就被当成是错误处理函数在栈上的索引。(在当前的实现里,这个索引不能是伪索引。)在发生运行时错误时,这个函数会被调用而参数就是错误信息。错误处理函数的返回值将被lua_pcall
作为出错信息返回在堆栈上。
典型的用法中,错误处理函数被用来在出错信息上加上更多的调试信息,比如栈跟踪信息 (stack traceback) 。这些信息在lua_pcall
返回后,因为栈已经展开 (unwound) ,所以收集不到了。
lua_pcall
函数在调用成功时返回 0 ,否则返回以下(定义在lua.h
中的)错误代码中的一个:
LUA_ERRRUN
: 运行时错误。LUA_ERRMEM
: 内存分配错误。 对于这种错,Lua 调用不了错误处理函数。LUA_ERRERR
: 在运行错误处理函数时发生的错误。
lua_pop
void lua_pop (lua_State *L, int n);
从堆栈中弹出 n
个元素。
lua_pushboolean
void lua_pushboolean (lua_State *L, int b);
把 b
作为一个 boolean 值压入堆栈。
lua_pushcclosure
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
把一个新的 C closure 压入堆栈。
当创建了一个 C 函数后,你可以给它关联一些值,这样就是在创建一个 C closure (参见 §3.4);接下来无论函数何时被调用,这些值都可以被这个函数访问到。为了将一些值关联到一个 C 函数上,首先这些值需要先被压入堆栈(如果有多个值,第一个先压)。接下来调用lua_pushcclosure
来创建出 closure 并把这个 C 函数压到堆栈上。参数n
告之函数有多少个值需要关联到函数上。lua_pushcclosure
也会把这些值从栈上弹出。
lua_pushcfunction
void lua_pushcfunction (lua_State *L, lua_CFunction f);
将一个 C 函数压入堆栈。这个函数接收一个 C 函数指针,并将一个类型为 function
的 Lua 值压入堆栈。当这个栈顶的值被调用时,将触发对应的 C 函数。
注册到 Lua 中的任何函数都必须遵循正确的协议来接收参数和返回值(参见 lua_CFunction
)。
lua_pushcfunction
是作为一个宏定义出现的:
#define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)
lua_pushfstring
const char *lua_pushfstring (lua_State *L, const char *fmt, …);
把一个格式化过的字符串压入堆栈,然后返回这个字符串的指针。它和 C 函数 sprintf
比较像,不过有一些重要的区别:
摸你需要为结果分配空间: 其结果是一个 Lua 字符串,由 Lua 来关心其内存分配 (同时通过垃圾收集来释放内存)。 这个转换非常的受限。 不支持 flag ,宽度,或是指定精度。 它只支持下面这些: ‘ %%
‘ (插入一个 ‘%
‘), ‘%s
‘ (插入一个带零终止符的字符串,没有长度限制), ‘%f
‘ (插入一个lua_Number
), ‘%p
‘ (插入一个指针或是一个十六进制数), ‘%d
‘ (插入一个int
), ‘%c
‘ (把一个int
作为一个字符插入)。
到此,相信大家对“Lua中有哪些常用函数”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!