जैसा कि पैट्रिक ने अपने उत्तर में कहा था, इसके लिए कुछ भी अंतर्निहित नहीं है, और 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
स्रोत
2016-01-09 11:32:54
अच्छा। धन्यवाद! मुझे वास्तव में रूबी से विचार मिला था;) '===' के बारे में नहीं पता था। इसके लिए भी धन्यवाद! रूबी में –
'===' सभी प्रकार की चीजें करेंगे: उदा। कक्षा के नाम के लिए यह जांच करेगा कि क्या मूल्य कक्षा का एक उदाहरण है, श्रेणियों के लिए यह जांच करेगा कि मूल्य सीमा में है, अज्ञात कार्यों (procs/lambdas) के लिए यह फ़ंक्शन भी कॉल करेगा, आदि। मुझे वास्तव में प्यार है कि इलीक्सिर में इस प्रकार का अस्पष्ट जादू नहीं है। शायद एलिक्सीर में मुझे थोड़ा और टाइप करने की आवश्यकता है लेकिन कम से कम मुझे पता है कि क्या हो रहा है ;-) –