【问题标题】:Understanding pattern matching and the pipe operator了解模式匹配和管道运算符
【发布时间】:2018-12-19 23:43:36
【问题描述】:

我很难理解下面的代码 sn-p:

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

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

【问题讨论】:

  • NB 您正在混淆元组{...} 和映射%{...}。后者是键值。

标签: elixir


【解决方案1】:

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

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


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

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

【讨论】:

    猜你喜欢
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多