Elixir 长生不老药火柴?不';在模块中不工作

Elixir 长生不老药火柴?不';在模块中不工作,elixir,Elixir,然而,iex中相同的比较产生了相反的结果 defmodule CompareMaps do def match do map = %{a: 2, b: 3, c: 4} test = %{a: 3} match? test, map end end CompareMaps.match true match?/2是一个宏,它的第一个参数是一个模式,而不是一个值。在第一个代码段中,您正在测试模式test是否与map的值匹配,因为test是一个标识符,并且将与任何值

然而,iex中相同的比较产生了相反的结果

defmodule CompareMaps do
  def match do
    map = %{a: 2, b: 3, c: 4}
    test = %{a: 3}
    match? test, map
  end
end

CompareMaps.match
true

match?/2
是一个宏,它的第一个参数是一个模式,而不是一个值。在第一个代码段中,您正在测试模式
test
是否与
map
的值匹配,因为
test
是一个标识符,并且将与任何值匹配。如果在模块/iex中使用相同的代码,它们将给出相同的结果:

match? %{a: 4}, %{a: 3, b: 3}
false


match?/2
是一个宏,它的第一个参数是一个模式,而不是一个值。在第一个代码段中,您正在测试模式
test
是否与
map
的值匹配,因为
test
是一个标识符,并且将与任何值匹配。如果在模块/iex中使用相同的代码,它们将给出相同的结果:

match? %{a: 4}, %{a: 3, b: 3}
false


如果我尝试模式匹配,但它们不匹配,elixir抛出错误,那么比较地图的好方法是什么?我是否必须逐个遍历键值并进行比较?是的,您必须自己进行检查。这不是很多代码:
Enum.all?(test,fn{k,v}->map[k]==v end)#=>false
Enum.all?({a:2,b:3},fn{k,v}->map[k]==v end)#=>true
。如果我尝试模式匹配,但它们不匹配elixir抛出错误,那么比较贴图的好方法是什么?我是否必须逐个遍历键值并进行比较?是的,您必须自己进行检查。这不是很多代码:
Enum.all?(test,fn{k,v}->map[k]==v end)#=>false
Enum.all?({a:2,b:3},fn{k,v}->map[k]==v end)#=>true
iex(1)> CompareMaps.match
=> true
iex(1)> map = %{a: 2, b: 3, c: 4}
%{a: 2, b: 3, c: 4}
iex(2)> test = %{a: 3}
%{a: 3}
iex(3)> match? test, map
true