2016-01-07 9 views

उत्तर

32

case के साथ यह संभव नहीं है, लेकिन आप उपयोग कर सकते हैं cond:

cond do 
    some_string == "string"      -> # do something 
    String.match?(some_string, ~r/string[\d]+/) -> # do something 
    true          -> # do something 
end 

कारण में हुक करने का कोई तरीका नहीं है कि वहाँ है विशिष्ट मानों के लिए विशेष कार्यों को कॉल करके मिलान पैटर्न। मुझे लगता है कि आपको रुबी से यह विचार मिला है, जो विशेष ऑपरेटर === को परिभाषित करके इसे लागू करता है। इसे रूबी के केस स्टेटमेंट द्वारा निहित रूप से बुलाया जाएगा और एक रेगेक्स के लिए यह दिए गए मूल्य से मेल खाएगा।

+1

अच्छा। धन्यवाद! मुझे वास्तव में रूबी से विचार मिला था;) '===' के बारे में नहीं पता था। इसके लिए भी धन्यवाद! रूबी में –

+3

'===' सभी प्रकार की चीजें करेंगे: उदा। कक्षा के नाम के लिए यह जांच करेगा कि क्या मूल्य कक्षा का एक उदाहरण है, श्रेणियों के लिए यह जांच करेगा कि मूल्य सीमा में है, अज्ञात कार्यों (procs/lambdas) के लिए यह फ़ंक्शन भी कॉल करेगा, आदि। मुझे वास्तव में प्यार है कि इलीक्सिर में इस प्रकार का अस्पष्ट जादू नहीं है। शायद एलिक्सीर में मुझे थोड़ा और टाइप करने की आवश्यकता है लेकिन कम से कम मुझे पता है कि क्या हो रहा है ;-) –

17

जैसा कि पैट्रिक ने अपने उत्तर में कहा था, इसके लिए कुछ भी अंतर्निहित नहीं है, और cond शायद आपका सबसे अच्छा विकल्प है।

लेकिन एक और विकल्प जोड़ने और एलिक्सीर की लचीलापन दिखाने के लिए: case एलीक्सिर में सिर्फ एक मैक्रो है, आप इसे करने के लिए regex_case जैसे अपने मैक्रो को कार्यान्वित कर सकते हैं।

आपको यह ध्यान रखना चाहिए कि इस परियोजना पर नए लोगों के लिए कोड को समझना मुश्किल हो सकता है, लेकिन यदि आप बहुत सारे रेगेक्स मिलान करते हैं, तो शायद व्यापार बंद हो सकता है। आप ही फैन्सला करें।

मैंने कुछ समय पहले implemented this, बस देखने के लिए कि यह संभव था:

defmodule RegexCase do 
    defmacro regex_case(string, do: lines) do 
    new_lines = Enum.map lines, fn ({:->, context, [[regex], result]}) -> 
     condition = quote do: String.match?(unquote(string), unquote(regex)) 
     {:->, context, [[condition], result]} 
    end 

    # Base case if nothing matches; "cond" complains otherwise. 
    base_case = quote do: (true -> nil) 
    new_lines = new_lines ++ base_case 

    quote do 
     cond do 
     unquote(new_lines) 
     end 
    end 
    end 
end 

defmodule Run do 
    import RegexCase 

    def run do 
    regex_case "hello" do 
     ~r/x/ -> IO.puts("matches x") 
     ~r/e/ -> IO.puts("matches e") 
     ~r/y/ -> IO.puts("matches y") 
    end 
    end 
end 

Run.run 
+2

बहुत सच है और वास्तव में व्यापार-बंद मुश्किल होगा। कोड नमूना के लिए भी धन्यवाद! –

+1

चूंकि किसी ने मुझे इस कोड के लाइसेंस के बारे में पूछने के लिए ईमेल किया है: मैं इसे सार्वजनिक डोमेन में मानता हूं। तो एट्रिब्यूशन या स्ट्रिंग संलग्न किए बिना इसका इस्तेमाल करने में संकोच न करें। –

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