Elixir比赛?在模块中不起作用

Cla*_*ton 1 elixir

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

CompareMaps.match
true
Run Code Online (Sandbox Code Playgroud)

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

match? %{a: 4}, %{a: 3, b: 3}
false
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 5

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

defmodule CompareMaps do
  def match do
    match? %{a: 3}, %{a: 2, b: 3, c: 4}
  end
end
Run Code Online (Sandbox Code Playgroud)
iex(1)> CompareMaps.match
=> true
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)