簡體   English   中英

使用C API覆蓋Lua中的賦值運算符

[英]Override Assignment Operator in Lua with C API

我在我的C ++程序中有對象,我將其作為userdata傳遞給Lua,並且我覆蓋此userdata的metatable,以便對象的索引(通過__newindex和__index)的賦值導致對C的調用,這將轉換賦值影響C ++對象或將C ++元素轉換為Lua值(另一個用戶數據或基本類型,如bool,number,string)。 userdata作為參數傳遞給從我的C ++程序調用的類似事件的Lua函數。

luaL_newmetatable(L, "object");
lua_pushstring(L, "__index");
lua_pushvalue(L, -2);  /* pushes the metatable */
lua_settable(L, -3);  /* metatable.__index = metatable */

luaL_openlib(L, NULL, vallib_m, 0);
luaL_openlib(L, "internal", vallib_f, 0);

lua_pushstring(L, "__index");
lua_pushstring(L, "get");
lua_gettable(L, 2);  /* get val.get */
lua_settable(L, 1);  /* metatable.__index = val.get */

lua_pushstring(L, "__newindex");
lua_pushstring(L, "set");
lua_gettable(L, 2); /* get array.set */
lua_settable(L, 1); /* metatable.__newindex = val.set */

但是,這不允許我自己分配實際變量,只允許變量的索引。 沒有用於直接覆蓋賦值運算符的元事件,因此我正在尋找一種解決方法。

換句話說,我可以這樣做: lua_userdata_object_passed_as_arg_to_event["is_it_true"]=true並且它將Lua布爾值分配給我的內部C ++對象,但是如果我這樣做: lua_userdata_object_passed_as_arg_to_event = new_object()它將改變Lua變量引用的內容,但是根據我的理解,它不會對核心對象做任何事情。

我考慮過的一個解決方法是,如果他們想要更改對象本身,則需要開發人員執行lua_userdata_object_passed_as_arg_to_event["__self"] = new_object() 。但這是不可取的。

所以我找到了一些獨特的解決方案,通過使用全局變量和覆蓋全局metatable賦值運算符來覆蓋賦值運算符,但我希望看看是否有人可以幫我解釋這個解決方案。 請參閱http://lua-users.org/lists/lua-l/2012-01/msg00413.htmlhttps://www.lua.org/pil/14.2.html 特別是,我的變量是函數參數,而不是全局變量,所以我如何通過C API轉換為全局變量,以便任何分配將被自定義C函數捕獲,如果分配發生在全局用戶數據上,它將采取行動?

順便說一下,我的userdata是一個指向對象的指針,以避免重復大對象,如果這很重要的話。

Lua和C / C ++是具有不同需求的不同語言。 在C / C ++中,變量始終引用特定對象 您可以更改此對象的內容,但永遠不能使變量處理不同的對象。 如果你做a = b; ,你正在將b的值復制到a 你永遠無法改變什么對象a都在談論。

在Lua中,變量不會永久引用任何內容。 因此,當前變量所持有的對象與該對象的值之間存在區別。

你的kludge通過全局變量函數,但local變量是不存在的東西。 它們是Lua堆棧上的位置; 你無法覆蓋Lua關於它們的默認行為。

處理這個問題的最好方法是接受 C和Lua之間的區別。 在Lua中編寫代碼就像在Lua中編寫代碼一樣。 不要試圖使Lua代碼像C一樣工作; 那種方式很愚蠢。 它們是不同的語言,你應該接受它們的差異,而不是反對它們。

如果你想讓Lua能夠執行相當於a = b ,那么你應該在你的類型中創建一個名為assign的函數或者允許你分配給對象值的函數。 就像您想要將所有表元素從一個表復制到另一個表一樣,您必須編寫一個函數來執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM