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

Jor*_*Kok 1 elixir phoenix-framework

在凤凰框架中

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

匹配正常,但使用:符号不匹配模式

def show(conn, %{"id": id}) do
  json conn, Repo.get(User, id)
end
Run Code Online (Sandbox Code Playgroud)

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

conn
|> get(user_path(conn, :show, user.id))
|> json_response(200)
Run Code Online (Sandbox Code Playgroud)

She*_*yar 6

%{key: value}Atom钥匙的简称,而不是String钥匙.让我们澄清一些事情:

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

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

%{:a => 1} == %{"a": 1}
# => true
Run Code Online (Sandbox Code Playgroud)

因此,当你写作时%{"id": id},它意味着:%{id: id}哪个不是 %{"id" => id},因为你的参数图没有:id键,所以它不匹配.


作为旁注,我实际上写了一个插件,在Phoenix控制器中使用原子键来保持params匹配简短和甜蜜.