跳到主要内容

lua53

简介

用于执行 lua 脚本, 相关 lua 代码

lua gc 问题

lua 的 gc 回收是在 gs 调用 lua_gc 函数来实现的, 目前是 1024 次 lua 调用 pcall 或者 LuaFunction.invoke, 自动 gc 一次

在 gs 里启动 lua 虚拟机

object lua = lua53.open();

在 gs 里执行 lua 代码

lua.dostring("print(\"hello lua\"));

向 lua 注册 gs 函数, 并在 lua 中完成调用

  • 向 lua 注册 gs 函数
lua.register_gs_function((int a, int b){
return a + b;
}, "callgs");
  • 在 lua 中完成调用
提示

这里通过 gs 中的, dostring 模拟在 lua 中的调用, 当然可以在 lua 源码中直接完成调用

write(lua.dostring("callgs(10, 20)"));

设置 lua 的 require 的搜索路径

设置之后, lua 的 require 路径从设置路径开始算, 设置的为脚本路径, 请确保该路径在可被访问

lua.set_search_path("");

在 gs 中持有 lua 的 table

在 gs 中, 回通过 LuaTable 代理 lua 的 table

PS

在 gs 中持有的 lua table, 为弱引用, 请必须保证其在 lua 中不会被 gc 回收, 如果被 gc 回收, 该 table 无法使用

  • 通过 set_val(mixed key, mixed val) 来设置 table 的值
  • 通过 get_val(mixed key) 来获取 table 的值
  • 通过 set_metatable(map | LuaTable key) 来设置 metatable 的
  • 通过 get_metatable() 来获取 metatable 的

在 gs 调用 lua 的函数

在 gs 中, 回通过 LuaFunction 代理 lua 的函数 LuaFunction

  • 可以通过 load_file, load_string, load_buffer 得到

    这种方式获得的 LuaFunction 保证在 lua 里面存活

  • 也可以通过 do_string 或者 调用 LuaFunction 的返回值得到

    这种方式获得函数, 使用 弱引用, 需要开发自己保证该函数在 lua 中不被 gc

// foo2.lua
// return function(a, b)
// return a + b
// end
LuaFunction func = lua.load_file("./test/modules/foo2.lua").invoke(); // 从返回值获取 lua 闭包
write(func.invoke(10, 20)); // 30

组件接口

lua53.gs

函数原型函数作用
object open()新建一个 lua 虚拟机, 并绑定到 gs 操作类上

lua_state.gs

lua 虚拟机操作对象

函数原型函数作用
mixed dofile(mixed path)执行对应的 lua 文件
mixed dostring(mixed code, string name = "gs_lua")将 string 作为 lua 脚本执行
mixed pcall(string func_name, ...)调用 lua 函数
LuaFunction load_file(string path, string mode = "bt")将对应文件加载为 lua chunk
LuaFunction load_string(string code, string mode = "bt")将对应字符串加载为 lua chunk
LuaFunction load_buffer(buffer code, string mode = "bt")将对应 buffer 加载为 lua chunk
LuaTable new_lua_table(map val = nil)将 gs 的 map 推到 lua, 中

样例

// 启动虚拟机
_lua = lua53.open();
_lua.dostring("print(\"call in gs\")")