在Elixir映射中=>和:有什么区别?

时间:2018-10-27 19:18:41

标签: elixir phoenix-framework

在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)

2 个答案:

答案 0 :(得分:6)

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

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

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

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

因此,当您编写%{"id": id}时,其含义是:%{id: id}不是不是 %{"id" => id},并且由于参数映射没有{{1} }键,它不匹配。


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

答案 1 :(得分:0)

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