2011-09-29 15 views
8

मैंने सुना है कि कोड में tuples के माध्यम से रिकॉर्ड निर्दिष्ट करना एक बुरा अभ्यास है: मुझे हमेशा सादा tuples {record_name, value1, value2, something} के बजाय रिकॉर्ड फ़ील्ड्स (#record_name{record_field = something}) का उपयोग करना चाहिए।कैसे खरीदें Iets: Erlang में एक रिकॉर्ड के खिलाफ मैच?

लेकिन मैं ईटीएस तालिका के खिलाफ रिकॉर्ड कैसे मेल करूं? अगर मैं रिकॉर्ड के साथ एक मेज है, मैं केवल निम्नलिखित के साथ मेल कर सकते हैं:

ets:match(Table, {$1,$2,$3,something} 

यह स्पष्ट है कि एक बार मैं रिकॉर्ड परिभाषा करने के लिए कुछ नए क्षेत्रों को जोड़ने के इस पैटर्न मैच काम करना बंद कर देगा।

इसके बजाय, मैं कुछ इस तरह उपयोग करना चाहते हैं:

ets:match(Table, #record_name{record_field=something}) 

दुर्भाग्य से, यह एक खाली सूची देता है।

उत्तर

16

आपकी समस्या का कारण यह है कि जब आप #record_name{record_field=something} करते हैं तो अनिर्दिष्ट फ़ील्ड सेट होते हैं। यह एक रिकॉर्ड बनाने के लिए वाक्यविन्यास है, यहां आप एक रिकॉर्ड/टुपल बना रहे हैं जो ईटीएस पैटर्न के रूप में व्याख्या करेगा। जब आप एक रिकॉर्ड बनाते हैं तो सभी अनिर्दिष्ट फ़ील्ड उनके डिफ़ॉल्ट मान प्राप्त करेंगे, या तो रिकॉर्ड परिभाषा या डिफ़ॉल्ट डिफ़ॉल्ट मान undefined में परिभाषित किए गए हैं।

तो यदि आप फ़ील्ड विशिष्ट मान देना चाहते हैं तो आपको रिकॉर्ड में यह स्पष्ट रूप से करना होगा, उदाहरण के लिए #record_name{f1='$1',f2='$2',record_field=something}। अक्सर जब रिकॉर्ड्स और एट्स का उपयोग करते हैं तो आप सभी अनिर्दिष्ट फ़ील्ड को '_' पर सेट करना चाहते हैं, "मिलान करने के लिए" चर की परवाह नहीं करें "। विशेष, और अन्यथा अवैध, फ़ील्ड नाम _ का उपयोग करके इसके लिए एक विशेष वाक्यविन्यास है। उदाहरण के लिए #record_name{record_field=something,_='_'}

ध्यान दें कि आपके उदाहरण में आपने रिकॉर्ड नाम तत्व को टुपल में '$ 1' पर सेट किया है। रिकॉर्ड का प्रतिनिधित्व करने वाले टुपल में पहले तत्व के रूप में रिकॉर्ड नाम होता है। इसका अर्थ यह है कि जब आप ets तालिका बनाते हैं तो आपको {keypos,Pos} के साथ 1 के अलावा किसी अन्य चीज़ के साथ कुंजी स्थिति सेट करनी चाहिए अन्यथा यदि आपके पास 'सेट' या 'ऑर्डर_सेट' प्रकार की तालिका है तो कोई अनुक्रमणिका और बदतर नहीं होगा केवल तालिका में 1 तत्व प्राप्त करें। रिकॉर्ड फ़ील्ड की अनुक्रमणिका प्राप्त करने के लिए आप अपने उदाहरण #record_name.record_field में सिंटैक्स #Record.Field का उपयोग कर सकते हैं।

9

का उपयोग कर

ets:match(Table, #record_name{record_field=something, _='_'}) 

विवरण के लिए this देखें प्रयास करें।

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