Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PhoenixFramework(Elixir)中的参数绑定是如何工作的_Elixir_Phoenix Framework - Fatal编程技术网

PhoenixFramework(Elixir)中的参数绑定是如何工作的

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

因此,我正在编写一个快速的异步用户名验证检查,按照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) 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语言实现中的一个突出特性。