代码之家  ›  专栏  ›  技术社区  ›  code.cycling

长生不老药如何配型?

  •  0
  • code.cycling  · 技术社区  · 6 年前

    我是新来的长生不老药,我试图模式匹配,但似乎无法得到正确的。

    我有一个 译码 值为的变量

    {:ok,
     %{
       "_id" => "5b162c483d1f3152b7771a18",
       "exp" => 1529286068,
       "iat" => 1528422068,
       "password" => "$2a$10$hlTl8vV0ENjpRxI1tRVAi.Woxx.na36K/lbZm7FrqLoXfzyoVzFia"
     }}

    {:error, :invalid_token}

    我试图在这里使用if-else语句,但它总是指向if语句

    if { decoded, :ok } do
        IO.inspect(decoded)
      else
        IO.puts('The token is invalid');
    end
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Aleksei Matiushkin    6 年前

    模式匹配具有 没有什么 与条件运算符有关,更重要的是,它主要使用 避免使用条件运算符 我们有些人认为这是邪恶的。

    模式匹配运算符是 = . 当你这样做的时候 foo = 42 ,你实际上 模式匹配 42到[尚未绑定] foo 变量。这就是为什么下面的内容是完全有效的:

    foo = 42
    42 = foo # will succeed!
    #⇒ 42 
    :bar = foo # will raise
    # ** (MatchError) no match of right hand side value: 42
    

    回到你的例子:

    ok =
      {:ok,
       %{
         "_id" => "5b162c483d1f3152b7771a18",
         "exp" => 1529286068,
         "iat" => 1528422068,
         "password" => "pass"
      }}
    
    ko = {:error, :invalid_token}
    
    value = ok
    
    case value do
      {:ok, decoded} ->
        IO.inspect decoded, label: "Decoded"
      {:error, :invalid_token} ->
        IO.puts "Invalid token"
      {:error, unknown} ->
        IO.inspect unknown, label: "Unknown error"
    end 
    

    长生不老药将遍历所有的case子句,尝试逐个将参数与所有子句进行模式匹配。第一个成功者将被处死, 尚未解除束缚 变量将被绑定( decoded 在上面的例子中。)


    司扥噢特: 灵丹妙药 great guide great docs ,人们可能会考虑阅读它,而不是浪费时间在不成功的尝试等问题上。这里有一部分 pattern matching .

        2
  •  4
  •   pyae phyo hlaing    6 年前

    灵丹妙药, a = 1 并不意味着我们像其他编程语言一样给变量赋值1。

    等号表示我们断言左手边等于右手边。 就像基础代数。

    例如,
    iex> a =1

    iex> 1=a (在非功能性语言中不能这样做)

    在您的示例中,必须使用模式匹配来匹配元组。

    对于您的案例,您可以使用下面这样的模式匹配和案例语句。

    fine = {:ok,
    %{
       "_id" => "5b162c483d1f3152b7771a18",
       "exp" => 1529286068,
       "iat" => 1528422068,
       "password" => "pass"
    }}
    
    notfine = {:error, :invalid_token}
    
    input = fine # It can be fine or not fine 
    
    case input do
        #Here do pattern matching with incoming tuple
        {:ok,decoded} -> IO.inspect(decoded)
        {:error,decoded} -> IO.puts("The token is invalid")
    end