खोज…


गार्ड क्लॉज के बुनियादी उपयोग

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

ये नियम कीवर्ड द्वारा चिह्नित कर रहे हैं when , और वे के बीच जाना def function_name(params) और do समारोह परिभाषा। एक तुच्छ उदाहरण:

defmodule Math do

  def is_even(num) when num === 1 do
    false
  end
  def is_even(num) when num === 2 do
    true
  end

  def is_odd(num) when num === 1 do
    true
  end
  def is_odd(num) when num === 2 do
    false
  end

end

कहते हैं कि मैं इस उदाहरण के साथ Math.is_even(2) चलाता Math.is_even(2)is_even दो कार्यान्वयन हैं, जिसमें अलग-अलग गार्ड क्लॉज़ हैं। सिस्टम उन्हें क्रम में देखेगा, और पहला कार्यान्वयन चलाएगा जहां पैरामीटर गार्ड क्लॉज को संतुष्ट करते हैं। पहला व्यक्ति उस num === 1 निर्दिष्ट करता है जो सत्य नहीं है, इसलिए यह अगले एक पर चलता है। दूसरा व्यक्ति उस num === 2 निर्दिष्ट करता है, जो सत्य है, इसलिए यह वह कार्यान्वयन है जिसका उपयोग किया जाता है, और वापसी मान true होगा।

अगर मैं Math.is_odd(1) तो क्या होगा? सिस्टम पहले कार्यान्वयन को देखता है, और देखता है कि चूंकि num 1 , इसलिए पहले कार्यान्वयन का गार्ड क्लॉज संतुष्ट है। यह तब उस कार्यान्वयन का उपयोग करेगा और true लौटेगा, और किसी अन्य कार्यान्वयन को देखने में परेशान नहीं करेगा।

गार्ड्स उन प्रकार के ऑपरेशनों में सीमित हैं जिन्हें वे चला सकते हैं। एलिक्सिर प्रलेखन हर अनुमत ऑपरेशन को सूचीबद्ध करता है ; संक्षेप में, वे तुलना, गणित, बाइनरी संचालन, टाइप-चेकिंग (जैसे is_atom ), और मुट्ठी भर छोटे सुविधा कार्यों (जैसे length ) की अनुमति देते हैं। कस्टम गार्ड क्लॉज़ को परिभाषित करना संभव है, लेकिन इसके लिए मैक्रोज़ बनाने की आवश्यकता होती है और अधिक उन्नत गाइड के लिए इसे छोड़ दिया जाता है।


ध्यान दें कि गार्ड त्रुटियों को नहीं फेंकते हैं; उन्हें गार्ड क्लॉज की सामान्य विफलताओं के रूप में माना जाता है, और सिस्टम अगले कार्यान्वयन को देखने के लिए आगे बढ़ता है। यदि आप पाते हैं कि आपको (FunctionClauseError) no function clause matching मिल रहा है, तो जब आप काम करने की उम्मीद करते हैं, तो एक गार्ड फ़ंक्शन को कॉल करते समय, यह हो सकता है कि एक गार्ड क्लॉज जिसे आप काम करने की उम्मीद करते हैं, एक त्रुटि फेंक रहा है जो कि निगल रहा है।

अपने लिए यह देखने के लिए, किसी गार्ड के साथ एक फ़ंक्शन बनाएं और फिर कॉल करें, जिसका कोई मतलब नहीं है, जैसे कि यह शून्य से विभाजित करने का प्रयास करता है:

defmodule BadMath do
  def divide(a) when a / 0 === :foo do
    :bar
  end
end

BadMath.divide("anything") को कॉल करना कुछ हद तक BadMath.divide("anything") त्रुटि प्रदान करेगा (FunctionClauseError) no function clause matching in BadMath.divide/1 - जबकि यदि आपने "anything" / 0 सीधे चलाने की कोशिश की थी, तो आपको अधिक मदद मिलेगी त्रुटि: (ArithmeticError) bad argument in arithmetic expression



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow