首页 > 代码库 > lua how to

lua how to

总结了下lua的使用,有点乱,也不完善,先帖出来吧,这也可以成为自己更新的动力,毕竟是有人看的。


1. 创建一个table并设置表的元素:

 lua_newtable(L);
 lua_pushinteger(L,1);
 lua_pushstring(L,"abc");
 lua_settable(L,-3);
 lua_setglobal(L,"t");


以上的代码等价于脚本:

t = {‘abc‘}

或者:

t = {}

t[1] = ‘abc‘


注意lua_settable会作两次出栈,所以当调用:
lua_setglobal时,新创建的table仍然在栈顶。
 


2. 如何遍历table中的元素:


2.1 脚本中:
local tt = {1,2,3}
for k,v in ipairs(tt) do
    print(k,v)
end
 


3. 如何获取table的长度:


3.1 在脚本中:

t = {1,2,3}
print(#t)

输出3


3.2 在C代码中:

lua_objlen(L,index)

index为table所在的堆栈的位置。


该函数同样可以用来获取字符串或者userdata的长度


4. 如何访问文件:


f = io.open('test.txt,'r')
for line in f:lines() do
 print(line)
end
f:close()


file:read用法:
"*n": 读取一个数值,注意数值在文件中也是以字符串的形式保存的。
"*a": 从当前位置开始读取所有文件内容。 
"*l": 读取一行字符串,不指定参数的read即相当于read(‘*l‘)
 


5. 获取表的元素


t = {'abc',x=123,'def'}
print(t[1])

 

输出:

abc


说明:对于未指定key的value,默认的key为整形,并且从1开始计算


6. 如何通过lua API调用lua脚本里的函数

脚本中:

function f(a,b,c)
    return a..b..c
end
t = {x=1}


C代码中:


 lua_getglobal(L,"f"); /* function to be called */
 lua_pushstring(L, "how");                        /* 1st argument */
 lua_getglobal(L, "t");   /* table to be indexed */
 lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */
 lua_remove(L, -2);                  /* remove 't' from the stack */
 lua_pushinteger(L, 14);                          /* 3rd argument */
 lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */
 printf("get return value: %s\n",lua_tostring(L,-1));


会输出:


get return value: how12314

 


7. 如何使用多任务:

co = coroutine.create(function() print("hello,world") end)
coroutine.status(co)
print(coroutine.status(co))
--suspended
coroutine.resume(co)
--hello,world
print(coroutine.status(co))
--dead
 


8. 如何移除栈中的一个元素:

通过lua_remove可以移除栈中指定索引中的元素
具体的示例见:如何通过lua API调用lua脚本里的函数


9. 如何添加多行注释
对于多行注释,如何避免每行的开始都添加“--”?可以用下面的方法:

--[[ 

comment 1

comment 2

...

]]


多行注释以“--[[”开始,以“]]”结束



lua how to