2011-04-12 13 views
7

क्या किसी ऑब्जेक्ट के सभी गैर-शून्य पैरामीटर/गुण प्राप्त करने का कोई तरीका है? मैंने यह पाया: getmetadata(self.xxxx) और मुझे कुछ ऐसा लगता है जैसे: getalldata(self).लुआ में किसी ऑब्जेक्ट के सभी गुणों को कैसे ढूंढें?

मैं वर्तमान में एक परियोजना पर काम कर रहा हूं जहां लुआ शामिल है। दुर्भाग्यवश, कोई पूर्ण संदर्भ नहीं है और मुझे प्रीकंपील्ड सामग्री का उपयोग करना होगा।

मुझे उम्मीद है कि आप समझने में सक्षम हैं कि मैं क्या कहने की कोशिश कर रहा हूं।

उत्तर

8

मुझे लगता है कि जब आप बात कर रहे हैं "वस्तुओं" आप जा रहा हूँ इसका मतलब है "__index मेटाटेबल अन्य तालिकाओं के लिए इंगित करने योग्य लू टेबल"। यदि ऐसा नहीं है, तो यह जवाब आपकी मदद नहीं करेगा।

यदि आपकी ऑब्जेक्ट संरचना टेबल के साथ बनाई गई है (यह है, सभी __indexes टेबल हैं) तो आप सभी गुणों और विरासत गुणों को प्राप्त करने के लिए "उन्हें पार्स कर सकते हैं"।

यदि आपके पास __index के रूप में कोई फ़ंक्शन है तो आप जो भी पूछते हैं वह असंभव है; "उन मानों की सूची प्राप्त करने का कोई तरीका नहीं है जिसके लिए कोई फ़ंक्शन गैर-शून्य मान देता है"।

पहले मामले में, कोड इस तरह दिखेगा:

function getAllData(t, prevData) 
    -- if prevData == nil, start empty, otherwise start with prevData 
    local data = prevData or {} 

    -- copy all the attributes from t 
    for k,v in pairs(t) do 
    data[k] = data[k] or v 
    end 

    -- get t's metatable, or exit if not existing 
    local mt = getmetatable(t) 
    if type(mt)~='table' then return data end 

    -- get the __index from mt, or exit if not table 
    local index = mt.__index 
    if type(index)~='table' then return data end 

    -- include the data from index into data, recursively, and return 
    return getAllData(index, data) 
end 

लेकिन याद रखें, यदि आपका __index तों में से किसी एक समारोह है, वहाँ सभी गुण प्राप्त करने के लिए कोई रास्ता नहीं है; कम से कम लुआ से नहीं।

0

मेरा मानना ​​है कि वस्तुओं सिर्फ एक मेज हैं, तो आप किसी भी अन्य तालिका के रूप में गुण से अधिक तेज़ी से दोहराने में सक्षम होना चाहिए:

for i,v in ipairs(your_object) do body end 
+4

यह केवल आपको संख्यात्मक कुंजी "गुण" देता है। मैं बात करता हूं कि आप 'ipairs' के बजाय 'जोड़े' का मतलब था। – Jakob

+0

हां, जो कि ईगारिया में अपने पूर्ण समाधान में शामिल है। इस बग को इंगित करने के लिए धन्यवाद। – BMitch

1

मैं अपने खुद के printObject कोड लिखा .. यहाँ यह

function printObj(obj, hierarchyLevel) 
    if (hierarchyLevel == nil) then 
    hierarchyLevel = 0 
    elseif (hierarchyLevel == 4) then 
    return 0 
    end 

    local whitespace = "" 
    for i=0,hierarchyLevel,1 do 
    whitespace = whitespace .. "-" 
    end 
    io.write(whitespace) 

    print(obj) 
    if (type(obj) == "table") then 
    for k,v in pairs(obj) do 
     io.write(whitespace .. "-") 
     if (type(v) == "table") then 
     printObj(v, hierarchyLevel+1) 
     else 
     print(v) 
     end   
    end 
    else 
    print(obj) 
    end 
end 

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

+0

यह डिबगिंग उद्देश्यों के लिए उपयोगी कोड है। –

संबंधित मुद्दे