Elixir 1.7 - Collectable

संग्रहणीय प्रोटोकॉल




elixir

संग्रहणीय प्रोटोकॉल

डेटा संरचनाओं को पार करने के लिए एक प्रोटोकॉल।

Enum.into/2 फ़ंक्शन इस प्रोटोकॉल का उपयोग संग्रह में एक Enum.into/2 डालने के लिए करता है:

iex> Enum.into([a: 1, b: 2], %{})
%{a: 1, b: 2}

संग्रहणीय क्यों?

किसी संग्रह से मान लेने के लिए Enumerable प्रोटोकॉल उपयोगी है। मूल्यों की एक विस्तृत श्रृंखला का समर्थन करने के लिए, Enumerable प्रोटोकॉल द्वारा प्रदान किए गए फ़ंक्शन आकार नहीं रखते हैं। उदाहरण के लिए, Enum.map/2 एक नक्शा पास Enum.map/2 हमेशा एक सूची देता है।

यह डिजाइन जानबूझकर किया गया है। निश्चित आकार के साथ अनंत संग्रह, संसाधनों और अन्य संरचनाओं का समर्थन करने के लिए Enumerable करने योग्य बनाया गया था। उदाहरण के लिए, किसी श्रेणी में मानों को सम्मिलित करने का कोई मतलब नहीं है, क्योंकि इसका एक निश्चित आकार है जहां सिर्फ सीमा सीमाएं संग्रहीत हैं।

Collectable मॉड्यूल को Enumerable प्रोटोकॉल द्वारा छोड़े गए अंतर को भरने के लिए डिज़ाइन किया गया था। into/1 को Enumerable.reduce/3 के विपरीत के रूप में देखा जा सकता है। यदि Enumerable मानों को बाहर निकालने के बारे में है, तो Collectable.into/1 उन मूल्यों को एक संरचना में एकत्र करने के बारे में है।

उदाहरण

यह दिखाने के लिए कि Collectable प्रोटोकॉल को मैन्युअल रूप से कैसे उपयोग किया जाए, चलो MapSet लिए इसके कार्यान्वयन के साथ खेलते हैं।

iex> {initial_acc, collector_fun} = Collectable.into(MapSet.new())
iex> updated_acc = Enum.reduce([1, 2, 3], initial_acc, fn elem, acc ->
...>   collector_fun.(acc, {:cont, elem})
...> end)
iex> collector_fun.(updated_acc, :done)
#MapSet<[1, 2, 3]>

यह दिखाने के लिए कि प्रोटोकॉल को कैसे लागू किया जा सकता है, हम MapSet के कार्यान्वयन पर फिर से नज़र MapSet । इस कार्यान्वयन में "एकत्रित करना" तत्वों का सीधा मतलब है कि उन्हें MapSet.put/2 माध्यम से सेट में सम्मिलित करना।

defimpl Collectable do
  def into(original) do
    collector_fun = fn
      set, {:cont, elem} -> MapSet.put(set, elem)
      set, :done -> set
      _set, :halt -> :ok
    end

    {original, collector_fun}
  end
end

सारांश

प्रकार

command()
t()

कार्य

into/1

एक प्रारंभिक संचायक और एक "कलेक्टर" फ़ंक्शन लौटाता है

प्रकार

आदेश ()

command() :: {:cont, term()} | :done | :halt

टी ()

t() :: term()

कार्य

में (संग्रहणीय)

एक प्रारंभिक संचायक और एक "कलेक्टर" फ़ंक्शन लौटाता है।

लौटाया गया फ़ंक्शन एक शब्द और एक कमांड प्राप्त करता है और प्रत्येक {:cont, term} कमांड पर संग्रहणीय में शब्द इंजेक्ट करता है।

:done है एक आदेश के रूप में पारित :done है जब कोई और मान इंजेक्ट नहीं किया जाएगा। यह उपयोगी है जब संसाधनों को बंद करने या मूल्यों को सामान्य करने की आवश्यकता होती है। कमांड होने पर एक संग्रहणीय लौटाया जाना चाहिए :done

यदि इंजेक्शन अचानक बाधित हो जाता है :halt पारित हो जाता है और फ़ंक्शन किसी भी मूल्य को वापस कर सकता है क्योंकि इसका उपयोग नहीं किया जाएगा।

Collectable प्रोटोकॉल का उपयोग कैसे करें और into/1 उदाहरणों के लिए मॉड्यूल प्रलेखन देखें।