2015-06-02 10 views
13

मैं उत्सुक हूं जब मुझे पैटर्न को परिभाषित करते समय पैटर्न मिलान बनाम गार्ड क्लॉज का उपयोग करना चाहिए।इलीक्सिर: पैटर्न मैच या गार्ड

पैटर्न मिलान के साथ उदाहरण के लिए:

defmodule Exponent do 
    def power(value, 0), do: 1 
    def power(value, n), do: value*power(value, n-1) 
end 

बनाम गार्ड खंड:

defmodule Exponent do 
    def power(value, n) when n==0, do: 1 
    def power(value, n), do: value*power(value, n-1) 
end 

मेरा मतलब है दोनों एक ही परिणाम उपज लेकिन एक समाधान दूसरे के ऊपर प्राथमिकता दी जाती है? और यदि ऐसा है तो क्यों?

मैं एलिक्सीर के लिए नया हूं, इसलिए इस प्रश्न का उत्तर मेरे लिए स्पष्ट रूप से स्पष्ट नहीं है (अभी तक)। अग्रिम में धन्यवाद।

+0

क्या आप एक बनाम बनावट में किसी भी प्रदर्शन में कोई प्रदर्शन अंतर देखते हैं? यह पूछने पर कि क्या किसी दूसरे को पसंद किया जाता है, मुझे एक ऐसे प्रश्न का एक बड़ा उदाहरण मानता है जो कोई प्रदर्शन नहीं करता है, तो कोई राय नहीं है। बंद करने के लिए वोट दें। –

+0

मैं ईमानदारी से इतना नया हूं कि मैंने अभी तक इस तरह की चीज़ को बेंचमार्क करने का तरीका नहीं खोजा है ... मुझे भी इसी तरह के प्रश्न नहीं दिखाई दिए, इसलिए मैंने स्पष्ट रूप से पूछने का फैसला किया। – aren55555

+0

एक कार्यान्वयन और दूसरे के बीच एक अंतर हो सकता है लेकिन बिना किसी संदर्भ के यह कहना मुश्किल है। अभी आप एक प्रश्न पूछ रहे हैं "जो बेहतर है, केले या स्ट्रॉबेरी?" –

उत्तर

17

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

def sign(x) when x < 0, do: -1 
def sign(x) when x == 0, do: 0 
def sign(x) when x > 0, do: 1 

मैं गार्ड खंड में समानता ऑपरेटर के लिए "उचित" उपयोग के मामले लगता है जब यह और अधिक जटिल भाव, उदा के हिस्से के रूप में प्रयोग किया जाता है

def divisible?(x, divisor) when rem(x, divisor) == 0, do: true 
def divisible?(_x, _divisor), do: false 
संबंधित मुद्दे