在 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 控制器中使用原子键来保持参数匹配简短而甜蜜。
在 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 控制器中使用原子键来保持参数匹配简短而甜蜜。