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"×", 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该地图只有一个键(该键的值是否为地图并不重要)。我回答中的代码应该对你有用。