में एक टेबल की तरह उपयोगकर्ताडेट का इलाज करना मेरे पास सी ++ में कुछ कक्षाएं हैं जिन्हें मैं लुआ को बेनकाब करना चाहता हूं। 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 के माध्यम से मेरे प्रोग्राम में स्ट्रिंग, या मैं इसे सी इंटरफ़ेस के साथ करता हूं और सभी स्टैक मैनिप्ल्यूशंस के साथ सौदा करता हूं? और दूसरा, मैं उस समारोह को कैसे लिखूं ... लेकिन एक बार जब मैं फैसला करता हूं कि लेने का सबसे अच्छा मार्ग कौन सा है, तो मैं इससे निपटूंगा।
jsimmons 'जवाब लुआ 5.1 के लिए उत्कृष्ट है और इससे पहले, लेकिन lua 5.2 में, आप lua_setuservalue का उपयोग कर प्रत्येक userdata के साथ एक मेज सहयोगी और lua_getuservalue का उपयोग कर इसे प्राप्त कर सकते हैं। तो 5.2 उत्तर फ़ंक्शन वातावरण के बजाय इन नए टेबल एसोसिएशन का उपयोग करके jsimmons के समान होगा। –