Iphone 将Objective-C对象绑定到现有的Lua变量

Iphone 将Objective-C对象绑定到现有的Lua变量,iphone,objective-c,lua,Iphone,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对象绑定到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代码以及要作为
f
传递给Lua的对象,该对象位于
object
变量中:

#import "ScriptObject.h"

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

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

    L = luaL_newstate(); // create a new state structure for the interpreter
    luaL_openlibs(L); // load all the standard libraries into the interpreter
    lua_settop(L, 0);
    newScriptObject(L);

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

    // call the script
    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;
}

我尝试了来自的方法,但这不能处理Objective-C对象。我看了,但不清楚它是如何装订的


有人知道怎么做吗?

我自己找到的。这只是将定义的变量设置为Lua全局变量的
newScriptObject
函数末尾缺少的一行:

lua_setglobal(L, SCRIPT_OBJECT_LUA_KEY);

您想对该对象做什么?“它使用对象中定义的方法”是什么意思?@H2CO3我想调用它的一些方法。例如,如果Objective-C对象有一个
(NSString*)getString()
方法,则Lua代码可能会调用
luaVar:getString()
并获得结果。您必须澄清。显示您希望能够编写的Lua代码。你看过吗?您可能可以通过查看Wax如何桥接Lua和Objective-C找到解决方案(不再维护Wax,但这无关紧要,技术应该仍然适用)。@Schollii添加了我要编写的Lua代码,只是一个使用非nil
luaVar
变量的简单函数。我已经看过你的建议,但是
Lua-Objective-C-Bridge
不是面向iOS的,而且
Wax
非常难以移植到现代iOS项目中。事实上,我需要更简单的解决方案,而不是像这样的完整解决方案。我找到了答案,再次感谢!