将一个 Objective-C 对象绑定到一个已存在的 Lua 变量上。

我必须将一个 Objective-C 对象绑定到 Lua 脚本的变量中。我没有对这个 Lua 脚本进行写入的权限,我只是从 Objective-C 代码中加载和运行它。我知道它使用一个名为 luaVar 的变量,使用对象中定义的方法。以下是 Lua 代码:

function run()
    print("Running Lua script")
    print(luaVar)
    print("Ending Lua script")
end

run()

此脚本应打印 luaVar 变量,而不是 nil。现在,这是我使用的 Objective-C 代码。函数 validate 获取 script 参数中的 Lua 代码,并将对象传递给 Lua 作为 theObject 参数:

#import "ScriptObject.h"

static const char* SCRIPT_OBJECT_LUA_KEY = "f";
ScriptObject* scriptObject = nil;

- (void)validate:(NSString*)script withObject:(ScriptObject*)theObject {

    L = luaL_newstate(); // 创建一个解释器的新状态结构
    luaL_openlibs(L); // 将所有标准库加载到解释器中
    lua_settop(L, 0);
    newScriptObject(L);

    // 加载脚本
    int err = luaL_loadstring(L, [script cStringUsingEncoding:NSASCIIStringEncoding]);
    if (LUA_OK != err) {
        NSLog(@"Error while loading Lua script!");
        lua_pop(L, 1);
        return NO;
    }

    // 调用脚本
    err = lua_pcall(L, 0, LUA_MULTRET, 0);
    if (LUA_OK != err) {
        NSLog(@"Error while running Lua script: %s", lua_tostring(L, -1));
        lua_pop(L, 1);
        return NO;
    }

    lua_close(L);
}

static int newScriptObject(lua_State *L) {
    ScriptObject * __strong *lgo = (ScriptObject * __strong *)lua_newuserdata(L, sizeof(ScriptObject *));
    *lgo = scriptObject;

    luaL_getmetatable(L, SCRIPT_OBJECT_LUA_KEY);
    lua_setmetatable(L, -2);

    lua_newtable(L);
    lua_setuservalue(L, -2);

    NSLog(@"New ScriptObject created");
    return 1;
}

我尝试了 此 SO 答案 中的方法,但它无法处理 Objective-C 对象。我看了 此问题,但它不清楚如何进行绑定。

有人知道如何做到这一点吗?

点赞
用户417006
用户417006

我自己找到了。只是在newScriptObject函数的结尾处缺少了一行代码,它将定义的变量设置为Lua全局变量:

lua_setglobal(L, SCRIPT_OBJECT_LUA_KEY);
2014-01-15 08:57:40