【问题标题】:How to pattern match in Elixir?如何在 Elixir 中进行模式匹配?
【发布时间】:2018-06-29 06:39:46
【问题描述】:

我是 elixir 的新手,我正在尝试进行模式匹配,但似乎无法做到正确。

我有一个 decoded 变量,其值为

{: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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    在 elixir 中,a = 1 并不意味着我们像其他编程语言一样将 1 分配给变量。

    等号表示我们断言左侧等于右侧。 就像基本代数一样。

    例如,
    iex> a =1
    1
    iex> 1=a(你不能在非函数式语言中这样做)
    1

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

    对于您的情况,您可以使用模式匹配和 case 语句,如下所示。

    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
    

    【讨论】:

      【解决方案2】:

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

      模式匹配运算符是=。当您执行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 
      

      Elixir 将遍历所有 case 子句,尝试将参数与所有子句一一进行模式匹配。第一个成功的将被执行,尚未绑定的变量将被绑定(上面例子中的decoded。)


      旁注: Elixir 有一个great guidegreat docs,人们可能会考虑阅读它,而不是将时间浪费在不成功的尝试和 SO 问题上。这是pattern matching上的一部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 2020-09-18
        • 1970-01-01
        相关资源
        最近更新 更多