Lua学习笔记


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脚本的执行

hello.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的使用

C++结合lua:LuaBridge让这一切变得更简单(包括变量和函数)一尺丈量的博客-CSDN博客luabridge

 

lua调用c++中的函数(使用LuaBridge) - 简书 (jianshu.com)

相关