मुझे लगता है कि जब आप बात कर रहे हैं "वस्तुओं" आप जा रहा हूँ इसका मतलब है "__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
तों में से किसी एक समारोह है, वहाँ सभी गुण प्राप्त करने के लिए कोई रास्ता नहीं है; कम से कम लुआ से नहीं।
यह केवल आपको संख्यात्मक कुंजी "गुण" देता है। मैं बात करता हूं कि आप 'ipairs' के बजाय 'जोड़े' का मतलब था। – Jakob
हां, जो कि ईगारिया में अपने पूर्ण समाधान में शामिल है। इस बग को इंगित करने के लिए धन्यवाद। – BMitch