Erlang 21 - 10. Records

10 रिकॉर्ड




erlang

10 रिकॉर्ड

एक रिकॉर्ड तत्वों की एक निश्चित संख्या को संग्रहीत करने के लिए एक डेटा संरचना है। इसका नाम खेतों है और सी में एक संरचना के समान है। संकलन के दौरान रिकॉर्ड अभिव्यक्तियों को टुपल अभिव्यक्तियों के लिए अनुवादित किया जाता है। इसलिए, रिकॉर्ड अभिव्यक्तियों को शेल द्वारा समझा नहीं जाता है जब तक कि विशेष क्रियाएं नहीं की जाती हैं। विवरण के लिए, STDLIB में shell(3) मैनुअल पेज देखें।

Programming Examples में और उदाहरण दिए गए हैं।

10.1 रिकॉर्ड को परिभाषित करना

एक रिकॉर्ड परिभाषा में रिकॉर्ड के नाम शामिल होते हैं, उसके बाद रिकॉर्ड के क्षेत्र के नाम होते हैं। रिकॉर्ड और फ़ील्ड नाम परमाणु होने चाहिए। प्रत्येक फ़ील्ड को एक वैकल्पिक डिफ़ॉल्ट मान दिया जा सकता है। यदि कोई डिफ़ॉल्ट मान नहीं दिया जाता है, तो undefined का उपयोग किया जाता है।

-record(Name, {Field1 [= Value1],
               ...
               FieldN [= ValueN]}).

मॉड्यूल की विशेषताओं और फ़ंक्शन घोषणाओं के बीच एक रिकॉर्ड परिभाषा को कहीं भी रखा जा सकता है, लेकिन रिकॉर्ड के किसी भी उपयोग से पहले परिभाषा को आना चाहिए।

यदि कोई रिकॉर्ड कई मॉड्यूल में उपयोग किया जाता है, तो यह अनुशंसा की जाती है कि रिकॉर्ड परिभाषा को किसी फ़ाइल में रखा जाए।

10.2 रिकॉर्ड बनाना

निम्न अभिव्यक्ति एक नया Name रिकॉर्ड बनाती है, जहाँ प्रत्येक फ़ील्ड का मान FieldI है, जो संबंधित अभिव्यक्ति ExprI के मूल्यांकन का मूल्य है:

#Name{Field1=Expr1,...,FieldK=ExprK}

फ़ील्ड किसी भी क्रम में हो सकते हैं, जरूरी नहीं कि रिकॉर्ड परिभाषा में भी यही क्रम हो, और फ़ील्ड को छोड़ा जा सकता है। बदले हुए फ़ील्ड से उनके संबंधित डिफ़ॉल्ट मान प्राप्त होते हैं।

यदि कई क्षेत्रों को समान मान सौंपा जाए, तो निम्नलिखित निर्माण का उपयोग किया जा सकता है:

#Name{Field1=Expr1,...,FieldK=ExprK, _=ExprL}

तब फ़ील्ड्स को उनके डिफ़ॉल्ट मानों के बजाय ExprL का मूल्यांकन करने का मूल्य मिलता है। यह सुविधा मुख्य रूप से ETS और Mnesia मैच फ़ंक्शंस के लिए पैटर्न बनाने के लिए उपयोग की जाने वाली है।

उदाहरण:

-record(person, {name, phone, address}).

...

lookup(Name, Tab) ->
    ets:match_object(Tab, #person{name=Name, _='_'}).

10.3 रिकॉर्ड फ़ील्ड एक्सेस करना

Expr#Name.Field

निर्दिष्ट फ़ील्ड का मान लौटाता है। Expr एक Name रिकॉर्ड का मूल्यांकन करने के लिए है।

निम्न अभिव्यक्ति रिकॉर्ड के टपल प्रतिनिधित्व में निर्दिष्ट क्षेत्र की स्थिति लौटाती है:

#Name.Field

उदाहरण:

-record(person, {name, phone, address}).

...

lookup(Name, List) ->
    lists:keysearch(Name, #person.name, List).

10.4 अद्यतन अभिलेख

Expr#Name{Field1=Expr1,...,FieldK=ExprK}

Expr एक Name रिकॉर्ड का मूल्यांकन करने के लिए है। इस रिकॉर्ड की एक प्रति लौटा दी गई है, प्रत्येक निर्दिष्ट फ़ील्ड के मूल्य के साथ FieldI ने संबंधित एक्सप्रेशन के मूल्यांकन के मूल्य को बदल दिया है। अन्य सभी क्षेत्र अपने पुराने मूल्यों को बनाए रखते हैं।

10.5 रेकॉर्ड्स में

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

उदाहरण:

handle(Msg, State) when Msg==#msg{to=void, no=3} ->
    ...

handle(Msg, State) when State#state.running==true ->
    ...

एक प्रकार का परीक्षण भी है BIF is_record(Term, RecordTag)

उदाहरण:

is_person(P) when is_record(P, person) ->
    true;
is_person(_P) ->
    false.

पैटर्न में 10.6 रिकॉर्ड

एक पैटर्न जो एक निश्चित रिकॉर्ड से मेल खाता है उसी तरह से बनाया जाता है जैसे एक रिकॉर्ड बनाया जाता है:

#Name{Field1=Expr1,...,FieldK=ExprK}

इस स्थिति में, Expr1 एक या अधिक ... ExprK अनबाउंड वैरिएबल हो सकता है।

10.7 नेस्टेड रिकॉर्ड

Erlang / OTP R14 से शुरुआत करते हुए, नेस्टेड रिकॉर्ड तक पहुंचने या अपडेट करने के दौरान कोष्ठक को छोड़ा जा सकता है। निम्नलिखित रिकॉर्ड परिभाषाएँ मानें:

-record(nrec0, {name = "nested0"}).
-record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
-record(nrec2, {name = "nested2", nrec1=#nrec1{}}).

N2 = #nrec2{},
    

R14 से पहले, कोष्ठक की आवश्यकता इस प्रकार थी:

"nested0" = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0.name,
N0n = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0{name = "nested0a"},
    

R14 के बाद से, निम्नलिखित भी लिखा जा सकता है:

"nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
N0n = N2#nrec2.nrec1#nrec1.nrec0#nrec0{name = "nested0a"},

10.8 अभिलेखों का आंतरिक प्रतिनिधित्व

संकलन के दौरान रिकॉर्ड अभिव्यक्तियों को टुपल अभिव्यक्तियों के लिए अनुवादित किया जाता है। एक रिकॉर्ड के रूप में परिभाषित:

-record(Name, {Field1,...,FieldN}).

आंतरिक रूप से tuple द्वारा दर्शाया गया है:

{Name,Value1,...,ValueN}

यहां प्रत्येक ValueI के लिए डिफ़ॉल्ट मान है।

रिकॉर्ड का उपयोग करने वाले प्रत्येक मॉड्यूल के लिए, रिकॉर्ड के बारे में जानकारी प्राप्त करने के लिए संकलन के दौरान एक छद्म फ़ंक्शन जोड़ा जाता है:

record_info(fields, Record) -> [Field]
record_info(size, Record) -> Size

Size टपल प्रतिनिधित्व का आकार है, अर्थात्, खेतों की संख्या से एक अधिक है।

इसके अलावा, #Record.Name रिकॉर्ड के Name के #Record.Name प्रतिनिधित्व में सूचकांक लौटाता है।

Name एक परमाणु होना चाहिए।