在 Elixir 地图中 => 和 : 之间有什么区别?

What is the difference between => and : in an Elixir map?

在 Phoenix 框架中

def show(conn, %{"id" => id}) do
  json conn, Repo.get(User, id)
end

匹配良好,但使用 : 表示法不匹配

def show(conn, %{"id": id}) do
  json conn, Repo.get(User, id)
end

当我从测试中调用以下代码时

conn
|> get(user_path(conn, :show, user.id))
|> json_response(200)

当您使用 : 时,密钥是一个原子。当您使用 => 时,键就是实际类型。 %{key: val} 实际上只是 %{:key => val} 的糖分。

%{key: value}Atom 键的缩写,而不是 String 键。 让我们弄清楚一些事情:

:"a" == "a"
# => false

:"a" == :a
# => true

%{:a => 1} == %{"a": 1}
# => true

所以当你写 %{"id": id} 时,它的意思是:%{id: id} 而不是 %{"id" => id},因为你的参数映射没有:id 键,它不匹配。


作为旁注,我实际上写了一个 Plug 来在 Phoenix 控制器中使用原子键来保持参数匹配简短而甜蜜。