बस पैटर्न मैच:
defmodule Test do
def my_func(%{"a" => value}), do: {:a, value}
def my_func(%{"b" => value}), do: {:b, value}
def my_func(_), do: :error
end
फिर आईईएक्स में
:
iex(1)> Test.my_func(%{"a" => 1})
{:a, 1}
iex(2)> Test.my_func(%{"b" => 2})
{:b, 2}
इसके अलावा खंड के आदेश महत्वपूर्ण हैं। उदाहरण के लिए आप %{"b" => 2}
मिलान करने के लिए कोशिश कर रहे हैं लेकिन आप नक्शे %{"a" => 1, "b" => 2}
निम्नलिखित, कुंजी "a"
पहले से मेल खाएगी है, क्योंकि पहले खंड में है अगर:
iex(3)> Test.my_func(%{"a" => 1, "b" => 2})
{:a, 1}
आप हर कुंजी के लिए कुछ उत्पन्न करने के लिए चाहते हैं तो आप मिलान कर सकते हैं मैं एक अलग दृष्टिकोण की सलाह देते हैं। उदाहरण के लिए, यदि आप उन कुंजियों को एक समारोह मैप करना चाहते हैं:
defmodule Test0 do
def my_op({"times_2", value}), do: {"times_2", value * 2}
def my_op({"times_3", value}), do: {"times_3", value * 3}
def my_op({key, value}), do: {key, value}
def my_func(m) do
Enum.map(m, &my_op/1) |> Enum.into(%{})
end
end
तो तुम मिलेगा निम्नलिखित: इस उत्तर के लिए टिप्पणियों के अनुसार
iex(1)> Test0.my_func(%{"times_2" => 2, "times_3" => 3, "whatever" => 42})
%{"times_2" => 4, "times_3" => 9, "whatever" => 42}
अद्यतन
आप एक चर के लिए एक कुंजी मिलान पैटर्न नहीं कर सकते हैं। समस्या यह है कि संकलक को उस कोड की खोज करने के लिए कोड उत्पन्न करने की आवश्यकता होती है जिसे वह अभी तक नहीं जानता है। जब आप पैटर्न मिलान करते हैं तो आप आमतौर पर संकलक को कुछ संकेत प्राप्त करते हैं जो इसे प्राप्त होगा। नक्शे में कुंजियों के लिए संकेत कुंजी ही है। इस मामले में, यह भी इंगित करते हुए कि पहला तर्क देखने की कुंजी होना चाहिए, यह संकलक के लिए पर्याप्त नहीं है। तो आपका दृष्टिकोण एक कथन का उपयोग करना चाहिए:
defmodule Test2 do
def my_func(k, m) do
if Map.haskey?(k, m), do: warning(k, m), else: foo(k, m)
end
def warning(k, m) do
#Warning
m
end
# In this function you could apply the pattern matching
# described in the first part of this answer.
def foo(k, m) do
value = # do something
%{m | key => value}
end
end
मुझे आशा है कि यह आपके प्रश्न का उत्तर देगा।
हाय, आपके उत्तर के लिए धन्यवाद।लेकिन मुझे शायद यह स्पष्ट करना चाहिए कि 'my_func (key, _)' में कुंजी रनटाइम पर निर्धारित एक चर है, यह संकलित समय – bottlenecked
ठीक नहीं है, अब मैं आंशिक रूप से समझता हूं कि आप क्या करने का प्रयास कर रहे हैं। वास्तव में आपका कार्य क्या करता है? –
उम, मुझे नहीं लगता कि यह फ़ंक्शन बॉडी को जोड़ने के लिए प्रासंगिक है, लेकिन अंत कोड लगभग "अगर कुंजी पहले से ही एक चेतावनी ट्रिगर कर रहा है, तो अन्यथा करें और इसे मानचित्र में जोड़ें" – bottlenecked