以下的內容均以tolua與c++的交互為例進行說明(tolua與其他語言的交互原理相通)
一、理一下peer表的作用
我們知道lua與其他語言的交互均以表的操作為基礎。假如現在lua中有一個已創建好的c++對象c++_obj,我們現在想在lua中對c++_obj進行擴展,具體的擴展細節暫時不考慮,我們只要考慮我們想要擴展的內容放到哪里比較合適。放到c++_obj對應的metatable中顯然不太合適,因為metatable中的內容是所有對象都具備的,而我們現在想擴展的內容是c++_obj這個對象獨有的。為了解決這個問題,lua中引入了一個專門的表來存放我們在lua中對其他語言的對象的擴展內容,這個表在tolua中就叫做peer表。c++_obj的metatable的__index指向一個c函數,當訪問c++_obj中的一個域的時候,會調用這個c函數,這個c函數會去查找各個關聯表,來取得我們要訪問的域,這其中就包括對peer表的查詢。
二、c++對象在lua層的擴展
1、lua5.1中的操作---tolua.setpeer和tolua.getpeer(這兩個方法用來是對peer表進行操作的)
a> tolua.setpeer的用法
tolua.setpeer(c++_obj,lua_table),將lua_table設置為c++_obj的peer表。此后,在對應c++_obj進行訪問的時候,會先去peer表中查詢,然后再去對應的metatable中查詢。
b> tolua.getpeer的用法
tolua_getpeer(c++_obj)取得c++_obj的peer表
2、lua5.1之前的操作---userdata+集合的形式(因為沒有以上兩個方法)
在注冊表中設置一個表(tolua_peer),這個表以userdata為key,以我們要擴展的內容為集合。在對c++_obj進行get/set的時候,會先取得userdate對應的集合,然后再去集合中取得對應的域。
