इसकी कुंजी द्वारा एक लुआ टेबल प्रविष्टि कैसे निकालें?


94

मेरे पास एक लुआ टेबल है जिसे मैं हैशमैप के रूप में उपयोग करता हूं, अर्थात स्ट्रिंग कुंजी के साथ:

local map = { foo = 1, bar = 2 }

मैं इस तालिका के एक तत्व को "पॉप" करना चाहूंगा जो इसकी कुंजी द्वारा पहचाना गया हो। एक table.remove()विधि है, लेकिन यह केवल (यानी एक संख्या) को हटाने के लिए तत्व का सूचकांक लेता है और सामान्य कुंजी नहीं। मैं ऐसा करने में सक्षम होना चाहूंगा table.remove(map, 'foo')और यहां बताया गया है कि मैंने इसे कैसे लागू किया:

function table.removekey(table, key)
    local element = table[key]
    table[key] = nil
    return element
end

क्या ऐसा करने का कोई बेहतर तरीका है?


4
+1 बहुत उपयोगी सवाल है क्योंकि आपने "उत्तर" दिया था जिसकी मुझे आवश्यकता थी; यहां तक ​​कि अगर वहाँ एक "बेहतर" तरीका नहीं है।
इयान बॉयड

जवाबों:


82

नहीं, कुंजी का मान सेट करना nilकिसी तालिका के हैशम भाग में किसी आइटम को निकालने का स्वीकृत तरीका है। आप जो कर रहे हैं वह मानक है। हालाँकि, मैं सलाह table.remove()दूंगा कि ओवरराइडिंग न करें - किसी टेबल के एरे हिस्से के लिए, डिफॉल्ट टेबल.आर्मोवे () कार्यक्षमता में सूचकांकों को फिर से शामिल करना शामिल है, जो आपका ओवरराइड नहीं करेगा। यदि आप अपने फंक्शन को tableफंक्शन सेट में जोड़ना चाहते हैं , तो मैं शायद इसे कुछ इस तरह table.removekey()या कुछ ऐसे नाम दूंगा।


हटाने के बारे में प्रतिक्रिया के लिए धन्यवाद। फ़ंक्शन के नाम के बारे में, यह मुख्य रूप से मेरी बात को स्पष्ट करने के लिए था। मैं आमतौर पर मानक कार्यों को ओवरराइड नहीं करता। मैं निश्चित रूप से उस नाम के तहत इसका उपयोग नहीं table.removekey()करूंगा ( मेरी सबसे अच्छी पसंद भी होगी)।
वूकाई

1
यदि आप केवल एक ही ब्लॉक के भीतर इसका उपयोग कर रहे हैं, तो आप इसे केवल एक स्थानीय फ़ंक्शन बनाने के बजाय प्रदर्शन-वार से बेहतर हो सकते हैं (प्रत्येक कॉल के लिए वैश्विक लुकअप के ओवरहेड को बचाता है)। मैं अक्सर स्थानीय नामस्थान में आयात करता हूं table.insertऔर table.removeअगर मैं उन्हें अक्सर उपयोग कर रहा हूं, तो अक्सर कुछ tinsert()और tremove()
एम्बर

प्रदर्शन टिप के लिए धन्यवाद। मैं स्थानीय नामस्थान में अक्सर उपयोग किए जाने वाले फ़ंक्शंस को आयात करने की कोशिश करूंगा ताकि यह पता चल सके कि यह एक बड़ा अंतर है।
वूकाई

ध्यान दें कि आपको इसे शून्य पर सेट करने के बजाय टेबल.रमोव (इंडेज़, पोज़िशन) का उपयोग करना चाहिए ताकि अनुक्रमणिका का विघटन हो जाए और इसलिए तत्वों को पुन: व्यवस्थित किया जाए।

@ हकनबोझेपेट टेबल के हैशमैप भाग (स्ट्रिंग कीज़) के लिए प्रासंगिक नहीं है।
एम्बर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.