了解模式匹配和管道运算符

时间:2018-12-19 15:30:50

标签: elixir

我很难理解以下代码段:

Comeonin.Argon2.add_hash("hello123") |> Comeonin.Argon2.check_pass("hello123")

输出:

{:ok,
 %{
   password: nil,
   password_hash: "$argon2i$v=19$m=65536,t=6,p=1$thCv1TGdiLszGx+bRugcqQ$EH8PpUqpCGTevihslOdSRPWS6+UlQJwv2pMOvwBJUS4"
 }}

我想在这里了解两件事:

  1. 使用|>时传递给第二个函数的参数顺序,是否总是总是作为第一个参数传递给函数? 如果需要将其作为第二个参数传递给函数怎么办?

  2. 如何模式匹配和解构返回值

因此,运行第一个功能,我会看到:

Comeonin.Argon2.add_hash("hello123")

%{
  password: nil,
  password_hash: "$argon2i$v=19$m=65536,t=6,p=1$GCmClx6W8PyzKjvh3UcKYQ$d3IMfhiEULCmMBuMF7eyBYgkPrXCBQdqQNOJNGr/3qI"
}

因此它正在返回地图。 我该如何图案匹配呢?

为什么不起作用?

{a, b} = Comeonin.Argon2.add_hash("hello123")

或者如果我想忽略第一把钥匙:

{_, b} = Comeonin.Argon2.add_hash("hello123")

对于模式匹配,我尝试了以下方法:

case Comeonin.Argon2.add_hash("hello123") do
 {password, password_hash} -> ...

end

但是我想一旦我了解了如何解构模式匹配就可以了吗?

1 个答案:

答案 0 :(得分:2)

  

使用|>时传递给第二个函数的参数顺序,是否总是总是作为第一个参数传递给函数? 如果需要将其作为第二个参数传递给函数怎么办?

是的,它总是作为第一个参数传递。如果需要将其作为第二个参数传递,则无需使用管道。


  

如何模式匹配和解构返回值

result =
  "hello123"
  |> Comeonin.Argon2.add_hash()
  |> Comeonin.Argon2.check_pass("hello123")

在不期望得到响应的情况下解构并提高

{:ok, %{password: password, password_hash: password_hash}} = result

处理任何可能的响应:

case result do
  {:ok, %{password: password, password_hash: password_hash}} -> ...
  _ -> :error
end

要进行模式匹配并返回任何成功的响应,

case result do
  {:ok, %{} = password_map} -> password_map
  _ -> :error
end