PhoenixFramework(Elixir)中的参数绑定是如何工作的
因此,我正在编写一个快速的异步用户名验证检查,按照PhoenixFrameworks网站上的教程,我可以这样做:PhoenixFramework(Elixir)中的参数绑定是如何工作的,elixir,phoenix-framework,Elixir,Phoenix Framework,因此,我正在编写一个快速的异步用户名验证检查,按照PhoenixFrameworks网站上的教程,我可以这样做: def validateUsername(conn, %{"username" => user}) do IO.inspect(conn) query = from u in User, where: u.username == ^user, select: [u.username] case Repo.all(query) d
def validateUsername(conn, %{"username" => user}) do
IO.inspect(conn)
query = from u in User,
where: u.username == ^user,
select: [u.username]
case Repo.all(query) do
[[username]] ->
conn
|> json(%{ success: false, error: "Username has been taken" })
[] ->
conn
|> json(%{ success: true })
nil ->
conn
|> json(%{ success: true })
_ ->
conn
|> json(%{ success: false, error: "Internal Server Error"})
end
但这对我来说意义不大,因为我从来没有处理过函数式编程语言,而且我知道elixir中使用=的数据绑定的工作方式不同。但在我的脑海里,我觉得应该颠倒过来,就像:
def validateUsername(conn, %{user => "username"})
或者类似的,所以我的主要问题是
%{username=>user}如何用相关信息填充用户变量
%{username=>user}如何用相关信息填充用户变量
这就是长生不老药中模式匹配的工作原理。该键应该与映射中的键匹配,并且该值应该是与映射中该键的值匹配的模式。如果它是一个正态变量,它只会被赋值
另外,假设您的数据库在users表中对username有唯一的约束,我将重写您的原始代码以使用Repo.get_by/2:
或
%{username=>user}如何用相关信息填充用户变量
这就是长生不老药中模式匹配的工作原理。该键应该与映射中的键匹配,并且该值应该是与映射中该键的值匹配的模式。如果它是一个正态变量,它只会被赋值
另外,假设您的数据库在users表中对username有唯一的约束,我将重写您的原始代码以使用Repo.get_by/2:
或
模式匹配可以被认为是在表达式的左侧分配所有变量,如果右侧具有正确的形状
{a, b} = {1, 2} # now a = 1, b = 2
%{"username" => user} = %{"username" => "Tomasz", "password" => "secret"} # now user = "Tomasz"
[a, b, c] = [:a, "b", 1] # a = :a, b = :b, c = 1
{a, b} = {1, 2, 3} # error
它也适用于嵌套数据
{[a, b, 3], {c, 5}} = {[1, 2, 3], {4, 5}}
Phoenix编程中有一个非常全面的模式匹配指南,其中还包括模式匹配可以被认为是在表达式的左侧分配所有变量(如果右侧具有正确的形状)
{a, b} = {1, 2} # now a = 1, b = 2
%{"username" => user} = %{"username" => "Tomasz", "password" => "secret"} # now user = "Tomasz"
[a, b, c] = [:a, "b", 1] # a = :a, b = :b, c = 1
{a, b} = {1, 2, 3} # error
它也适用于嵌套数据
{[a, b, 3], {c, 5}} = {[1, 2, 3], {4, 5}}
Phoenix编程中有一个非常全面的模式匹配指南,其中还包括模式匹配不是函数式编程固有的。它只是许多FP语言实现中的一个突出特性。模式匹配不是函数式编程固有的。它只是许多FP语言实现中的一个突出特性。