elixir

2016-07-06 15 views
11

में फ़ंक्शन हेड में मैप कुंजियों पर पैटर्न मिलान करने के लिए कैसे करें मुझे फ़ंक्शन हेड में मानचित्र की कुंजी पर पैटर्न मिलान का कोई तरीका नहीं दिख रहा है। क्या इसे करने का कोई तरीका है? मुझे क्या करना कोशिश कर रहा हूँ पर एक निश्चित कुंजी पहले से ही नहीं किसी नक्शे में मौजूद है या कि क्या आधार पर अलग अलग कोड चलाया जाता है (और यह भी बचना चाहते थे अगर/किसी और और की तरह)elixir

यह मेरा कोड

कैसा दिखता है
def my_func(key, %{key => _} = map), do: ... 

जो मुझे इस त्रुटि देता है

** (CompileError) मानचित्र कुंजी मैच अंदर चर कुंजी के अवैध उपयोग, नक्शे केवल का उपयोग कर^द्वारा मौजूदा चर पर मिलान कर सकते हैं कुंजी

बेशक

मैं भी ^

def my_func(key, %{^key => _} = map), do: ... 

जो तब देता है

** (CompileError) अनबाउंड चर अमृत^कुंजी

मैं उपयोग कर रहा हूँ का उपयोग कर इसे करने की कोशिश 1.3.1 विंडोज 8.1 मशीन पर/1 9 .064 xlang। पढ़ने के लिए धन्यवाद! कुंजी आप की जरूरत के साथ

उत्तर

12

बस पैटर्न मैच:

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 

मुझे आशा है कि यह आपके प्रश्न का उत्तर देगा।

+0

हाय, आपके उत्तर के लिए धन्यवाद।लेकिन मुझे शायद यह स्पष्ट करना चाहिए कि 'my_func (key, _)' में कुंजी रनटाइम पर निर्धारित एक चर है, यह संकलित समय – bottlenecked

+0

ठीक नहीं है, अब मैं आंशिक रूप से समझता हूं कि आप क्या करने का प्रयास कर रहे हैं। वास्तव में आपका कार्य क्या करता है? –

+0

उम, मुझे नहीं लगता कि यह फ़ंक्शन बॉडी को जोड़ने के लिए प्रासंगिक है, लेकिन अंत कोड लगभग "अगर कुंजी पहले से ही एक चेतावनी ट्रिगर कर रहा है, तो अन्यथा करें और इसे मानचित्र में जोड़ें" – bottlenecked