Lua学习笔记
Lua环境安装
Linux上安装Lua方法如下:
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
1、Lua基本语法
lua脚本的执行
print("hello world")
print("Chen qiang")
使用lua名执行脚本,输出结果如下:
cq@server:~/lua-workspace$ lua hello.lua
hello world
Chen qiang
也可以指定编译器运行,修改hello.lua如下:
#!/usr/local/bin/lua
?
print("hello world")
print("Chen qiang")
修改文件为可执行权限:chmod +x hello.lua
执行脚本如下:
cq@server:~/lua-workspace$ ./hello.lua
hello world
Chen qiang
?
注释
单行注释
-- 单行注释
多行注释
--[[
多行
注释
--]]
标识符
A~Z a~z 下划线开头可以接大小字符、数字 下划线开头后面最好不接大写字母,防止和lua内部使用的名称冲突。例如:_VERSION
不允许使用特殊字符:@、$和%
关键字
and if else elseif goto do not then nil while return break end function local trun false or for until
全局变量
默认情况下,变量总是全局变量
删除一个全局变量,将nil赋值给变量即可。
C++中调用lua
hello.lua
--简单的例子,只做整数加法
function add(x, y)
return x + y
end
main.cpp
#include#include using namespace std; extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" } int main() { //1.创建一个新的lua state,分配内存,创建 lua_State *L = luaL_newstate(); if (L == NULL) { cout << "New state fail"; return 0; } #if 0 // 2.加载Lua代码 int bRet = luaL_loadfile(L, "hello.lua"); if (bRet) { cout << "Load file fail"; return; } // 3.运行Lua脚本 bRet = lua_pcall(L, 0, 0, 0); if (bRet) { cout << "pcall error" << endl; return; } #else // 运行lua脚本,这一步可以取代2,3步 luaL_dofile(L, "hello.lua"); #endif // 此时栈顶为0,执行完毕lua_getglobal后压变量add入栈(lua中函数也是变量),栈顶为1, int bRet = lua_getglobal(L, "add"); // 压入参数1入栈,执行完毕lua_pushnumber后栈顶为2 lua_pushnumber(L, 12); // 压入参数2入栈,执行完毕lua_pushnumber后栈顶为3 lua_pushnumber(L, 23); // 执行add函数,2告诉lua栈中有2个参数,1告诉lua需要返回一个值,执行该函数时候,lua将参数2,参数1,函数名依次从栈取出然后执行,执行完毕后,把结果压入栈,所以执行完毕后栈顶为1,保存了返回结果给C++ lua_pcall(L, 2, 1, 0); // lua执行完毕会将结果放在栈顶,这里读出栈顶的结果,并打印 int ret = lua_tonumber(L, -1); cout << ret << endl; // 关闭当前lua state,释放内存 lua_close(L); return 0; }
编译运行:
cq@server:~/test-workspace$ g++ main.cpp -L./lib -llua -ldl -o main cq@server:~/test-workspace$ ./main 35
LuaBridge的使用