Elixir 以变量为键的地图上的模式匹配

Elixir 以变量为键的地图上的模式匹配,elixir,Elixir,如何在具有字符串键的地图上进行模式匹配 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

如何在具有字符串键的地图上进行模式匹配

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"}

如果保证映射只有一个条目(如注释中所述),则可以将其传递给,然后在结果上进行模式匹配:

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"

下面是一个可能的示例,其中包含一个或多个条目,可以使用

Phoenix flash消息以带有字符串键的地图形式存储在conn内,如下所示:

%{"info" => "Please check the content", "notice" => "No search results"}
这来自框架中的my layout_view.ex:

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
defmodule MyAppWeb.LayoutView do
使用MyAppWeb,:查看
...
#https://hexdocs.pm/phoenix_html/Phoenix.HTML.html#sigil_E/2
#https://hexdocs.pm/phoenix/Phoenix.Controller.html#get_flash/1
def显示闪存(连接)do
凤凰城。控制器。获取闪光灯(康涅狄格州)
|>flash_msg()
结束
当映射大小(消息)>=1 do时,def闪烁消息(消息)

对于{key,msg}您的意思是
%{“key1”=>bb}=my_map
?如果您想匹配任意键,那么这是不可能的,就像第一条错误消息所说的那样。@Dogbert,我想匹配一组键中的一个。@Dogbert,或者键的确切名称可能不知道,我如何才能得到它的名称?您的地图保证只包含一个条目吗?如果不是,你想要哪一个?@Dogbert,保证如果有多个条目,比如:%%{foo=>%%{“a”=>bar},我怎么能把foo作为变量?@fay你会在foo之前使用
^
操作符。请参见此处:@fay该地图只有一个键(该键的值是否为地图并不重要)。我回答中的代码应该对你有用。