2010-07-26 16 views
8

में एक टेबल की तरह उपयोगकर्ताडेट का इलाज करना मेरे पास सी ++ में कुछ कक्षाएं हैं जिन्हें मैं लुआ को बेनकाब करना चाहता हूं। WidgetMeta तालिका में एक मेटाटेबल सेट के साथ वापसी उपयोगकर्ता डेटा प्राप्त करने के लिए मैं Widget:New() पर कॉल कर सकता हूं।लुआ

w = Widget:New() 
w:Foo() -- Foo is defined in C code 

बस इतना ही बहुत सीधा है: WidgetMeta यह सभी सी ++ कार्य करता है, और यह __index खुद के लिए निर्धारित है है, तो मैं ऐसा कर सकते हैं।

अब यहां वह हिस्सा है जिसे मैं समझ नहीं सकता। मैं अपने उपयोगकर्ता डेटा पर लूआ परिभाषित चर और कार्यों को रखने में सक्षम होना चाहता हूं जैसे कि यह एक टेबल था। यह सीधे स्पष्ट रूप से नहीं किया जा सकता है। मैं इसे उपयोगकर्ता डेटा पर नहीं छोड़ सकता, क्योंकि मैं चाहता हूं कि यह प्रति उपयोगकर्ता डेटा अद्वितीय हो।

w1 = Widget:New() 
w2 = Widget:New() 

function w1:Bar() print "Hello!" end -- Both functions unique 
function w1:Baz() print "World!" end -- to their own userdata 

मेरे हमले की मौजूदा योजना है, जहां मैं प्रति-userdata कार्य करता है और चर स्टोर कर सकते हैं metatable कि userdata और टेबल के बीच नक्शे पर एक विशेष तालिका है है। समस्या यह है कि मुझे यकीन नहीं है कि ऐसा करने का सबसे अच्छा तरीका क्या है, या यदि कोई बेहतर समाधान है। तो मेरा प्रश्न दो गुना है: जब मैंने अपना __index और __newindex मेटामाइड्स सेट अप किया है, तो क्या मैं उन्हें लूआ कोड में एक टेक्स्ट फ़ाइल में लिखता हूं और बाकी सामान चलाने से पहले इसे चलाता हूं, या क्या मैं लू कोड सीधे सी से डालता हूं luaL_loadstring के माध्यम से मेरे प्रोग्राम में स्ट्रिंग, या मैं इसे सी इंटरफ़ेस के साथ करता हूं और सभी स्टैक मैनिप्ल्यूशंस के साथ सौदा करता हूं? और दूसरा, मैं उस समारोह को कैसे लिखूं ... लेकिन एक बार जब मैं फैसला करता हूं कि लेने का सबसे अच्छा मार्ग कौन सा है, तो मैं इससे निपटूंगा।

+1

jsimmons 'जवाब लुआ 5.1 के लिए उत्कृष्ट है और इससे पहले, लेकिन lua 5.2 में, आप lua_setuservalue का उपयोग कर प्रत्येक userdata के साथ एक मेज सहयोगी और lua_getuservalue का उपयोग कर इसे प्राप्त कर सकते हैं। तो 5.2 उत्तर फ़ंक्शन वातावरण के बजाय इन नए टेबल एसोसिएशन का उपयोग करके jsimmons के समान होगा। –

उत्तर

9

उपयोगकर्ता डेटा में एक फ़ंक्शन वातावरण जोड़ें, और उसके माध्यम से पहुंच को रीडायरेक्ट करें।

यहां मेरा कुछ पुराना कोड है जो प्रक्रिया का वर्णन करता है।

static int l_irc_index(lua_State* L) 
{ 
    /* object, key */ 
    /* first check the environment */ 
    lua_getfenv(L, -2); 
    lua_pushvalue(L, -2); 
    lua_rawget(L, -2); 
    if(lua_isnoneornil(L, -1) == 0) 
    { 
     return 1; 
    } 

    lua_pop(L, 2); 

    /* second check the metatable */  
    lua_getmetatable(L, -2); 
    lua_pushvalue(L, -2); 
    lua_rawget(L, -2); 

    /* nil or otherwise, we return here */ 
    return 1; 
} 

static int l_irc_newindex(lua_State* L) 
{ 
    /* object, key, value */ 

    lua_getfenv(L, -3); 
    lua_pushvalue(L, -3); 
    lua_pushvalue(L, -3); 
    lua_rawset(L, -3); 

    return 0; 
} 
+0

धन्यवाद, यह करने की कोशिश करने के लिए यह बहुत साफ था: डी – Alex

0

आपको वास्तव में टोलुआ ++ पर एक नज़र रखना चाहिए, जिसमें एक समान ही अवधारणा है। लुआ से बनाए गए सभी उपयोगकर्ता डेटा ऑब्जेक्ट्स में अपनी गुणों को संग्रहीत करने के लिए एक छिपी हुई तालिका होती है।

मैनुअल के इस खंड में वर्णन: http://www.codenix.com/~tolua/tolua++.html#additional