2014-01-14 40 views
-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爲ftheObject變量:

#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,但不清楚它是如何進行綁定的。

有誰知道該怎麼做?

+1

你怎麼想的對象呢? 「它使用對象中定義的方法」是什麼意思? – 2014-01-14 11:59:48

+0

@ H2CO3我想調用它的一些方法。例如,如果Objective-C對象有一個'(NSString *)getString()'方法,則Lua代碼可以調用'luaVar:getString()'並獲得結果。 –

+0

你將不得不澄清。顯示你想寫的Lua代碼。你看過https://github.com/torus/Lua-Objective-C-Bridge?您可以通過查看Wax如何橋接Lua和Objective-C(Wax不再維護,但不在這一點,這些技術仍然適用)來找到解決方案。 – Schollii

回答

0

自己找到了。這是一個在newScriptObject功能,設置定義的變量作爲一個Lua全球的結束只是一個缺失行:

lua_setglobal(L, SCRIPT_OBJECT_LUA_KEY); 
相關問題