首页 > 解决方案 > 了解模式匹配和管道运算符

问题描述

我很难理解以下代码片段:

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

但我想一旦我理解了如何解构模式匹配就会是一样的吗?

标签: elixir

解决方案


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

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


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

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

推荐阅读