2016-09-08 3 views
0

Wie kann ich eine Mustererkennung auf einer Karte mit einem Stringschlüssel vornehmen?Mustererkennung auf einer Karte mit Variable als Schlüssel

iex(1)> my_map = %{"key1" => "var1"} 
%{"key1" => "var1"} 
iex(2)> %{aa => bb} = my_map 
** (CompileError) iex:2: illegal use of variable aa inside map key match, maps can only match on existing variable by using ^aa 
    (stdlib) lists.erl:1354: :lists.mapfoldl/3 
iex(2)> %{"aa" => bb} = my_map 
** (MatchError) no match of right hand side value: %{"key1" => "var1"} 
+0

Sie meinen '% { "key1"=> bb} = my_map'? Wenn Sie beliebige Schlüssel zuordnen möchten, ist das nicht möglich, genau wie die erste Fehlermeldung sagt. – Dogbert

+0

@Dogbert, ich möchte einen aus einer Reihe von Schlüsseln übereinstimmen. – Johshi

+0

@Dogbert, oder der genaue Name des Schlüssels ist möglicherweise nicht bekannt, wie kann ich seinen Namen bekommen? – Johshi

Antwort

3

Wenn die Karte nur 1 Eintrag haben garantiert wird (wie Sie in den Kommentaren geklärt), können Sie es zu Map.to_list/1 passieren und dann Mustervergleich auf dem Ergebnis:

iex(1)> my_map = %{"key1" => "var1"} 
%{"key1" => "var1"} 
iex(2)> [{key, value}] = Map.to_list(my_map) 
[{"key1", "var1"}] 
iex(3)> key 
"key1" 
iex(4)> value 
"var1" 
+0

was ist, wenn mehr als ein Eintrag wie folgt ist:% {foo =>% {"a" => bar}}, Wie kann ich foo als Variable haben? – fay

+0

@fay würden Sie den Operator '^' vor foo verwenden. siehe hier: https://elixir-lang.org/getting-started/keywords-and-maps.html#maps – Sgnl

+0

@fay, dass die Karte nur einen Schlüssel hat (der Wert des Schlüssels, der eine Karte ist, spielt keine Rolle). Der Code in meiner Antwort sollte für Sie arbeiten. – Dogbert

0

Hier ist eine mögliche für Karten mit einer oder mehreren Einträgen ein für Verständnis http://elixir-lang.github.io/getting-started/comprehensions.html

Phoenix Flash-Mitteilungen verwendet werden innerhalb conn als Karte mit String-Schlüssel, so etwas wie diese gespeichert:

%{"info" => "Please check the content", "notice" => "No search results"} 

Dies ist aus meiner layout_view.ex im Rahmen:

defmodule MyAppWeb.LayoutView do 

    use MyAppWeb, :view 

    ... 

    #https://hexdocs.pm/phoenix_html/Phoenix.HTML.html#sigil_E/2 
    #https://hexdocs.pm/phoenix/Phoenix.Controller.html#get_flash/1 

    def show_flash(conn) do 
    Phoenix.Controller.get_flash(conn) 
    |> flash_msg() 
    end 

    def flash_msg(messages) when map_size(messages) >= 1 do  
    for { key, msg } <- messages do 
     content_tag(:div, class: "mapapp-alert myapp__#{key}") do 
     [ msg, 
      content_tag(:span, ~E"&times;", class: "myapp-closebtn", onclick: "this.parentElement.style.display='none';") 
     ] 
     end 
    end 
    end 

    def flash_msg(_) do 
    nil 
    end 

end 
Verwandte Themen