-1
我必須將一個Objective-C對象綁定到一個Lua腳本的變量。我沒有對這個Lua腳本的寫入權限,我只是從Objective-C代碼中加載並運行它。我知道它使用了一個名爲luaVar
的變量,它使用了對象中定義的方法。下面是Lua代碼:將一個Objective-C對象綁定到一個存在的Lua變量
function run()
print("Running Lua script")
print(luaVar)
print("Ending Lua script")
end
run()
這個腳本應該打印luaVar
變量,而不是nil
。現在,這裏是我使用的Objective-C代碼。該功能validate
獲得在script
變量和對象的Lua代碼傳遞到Lua爲f
在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(); // 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;
}
我想盡了辦法從this SO answer,但沒有處理Objective-C對象。我看着this question,但不清楚它是如何進行綁定的。
有誰知道該怎麼做?
你怎麼想的對象呢? 「它使用對象中定義的方法」是什麼意思? – 2014-01-14 11:59:48
@ H2CO3我想調用它的一些方法。例如,如果Objective-C對象有一個'(NSString *)getString()'方法,則Lua代碼可以調用'luaVar:getString()'並獲得結果。 –
你將不得不澄清。顯示你想寫的Lua代碼。你看過https://github.com/torus/Lua-Objective-C-Bridge?您可以通過查看Wax如何橋接Lua和Objective-C(Wax不再維護,但不在這一點,這些技術仍然適用)來找到解決方案。 – Schollii