传递给 Lua 以便 Lua 可以调用 native 函数的 C 函数是静态函数,因此与对象实例无关。
在我的应用程序中,我有多个 session 。每个 session 都在自己的线程上运行,有自己的数据和脚本, session N 的脚本必须能够访问 session N 的数据。
问题是,当您注册一个可从 Lua 调用的 native C 函数时,我无法传递 session 对象的实例以使其在静态 Lua 函数中可用。
一种可能是将 session 实例存储到一个静态变量中,该变量可以从静态 C 函数(从 Lua 调用)中调用,但这看起来很脏并且需要同步,这可能会导致某些脚本挂起。
第二种可能是创建一个表示 session 的 Lua 对象并调用它的成员方法,这样,在我的 C 函数中,我就有办法访问表示 session 的 Lua 对象(“this”)和检索此对象表示的实际 native session 实例。但我不知道该怎么做。
有没有办法在 Lua 中创建表示 native 对象实例的 Lua 对象,以便 native Lua 函数可以访问该 native 对象实例?
最佳答案
当你用 Lua 注册一个 C 函数时,你可以存储额外的值作为所谓的“upvalues”。然后,C 函数可以在调用时检索这些值:
// ...
// push session instance pointer
lua_pushlightuserdata( L, (void*)get_current_session() );
// create a closure with one upvalue
lua_pushcclosure( L, my_static_C_function, 1 );
// ... (the resulting Lua function is at the stack top now)
在您的静态 C 函数中,您可以像这样访问实例数据:
static int my_static_C_function( lua_State* L ) {
session_t* instance = (session_t*)lua_touserdata( L, lua_upvalueindex( 1 ) );
instance->do_something();
return 0;
}
关于C 和 Lua - 将 native 对象实例传递给 native Lua 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35290360/