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"
}}
我想在这里了解两件事:
使用 |> 时传递给第二个函数的参数的顺序,它总是作为第一个参数传递给函数吗?如果它需要作为第二个参数传递给函数怎么办?
如何进行模式匹配和解构返回值
所以运行第一个函数我看到了这个:
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
但我想一旦我理解了如何解构模式匹配就会是一样的吗?
解决方案
使用时传递给第二个函数的参数的顺序,
|>
它总是作为第一个参数传递给函数吗?如果它需要作为第二个参数传递给函数怎么办?
是的,它总是作为第一个参数传递。如果您需要将其作为第二个参数传递,则不要使用管道。
如何进行模式匹配和解构返回值
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
推荐阅读
- android - 阅读短信中的特定单词后打开活动
- java - java.sql.SQLException:无法使用 jdbc.queryForObject 在位置 1(值为 1)设置参数
- java - 如何从可用作自定义实体 ID 生成器中实体 ID 的对象属性生成 UID?
- python - 在 OpenLDAP 中将用户添加到 POSIX 或“memberOf”组
- linux - 如何在不附加的情况下将文本写入 HDFS 中的文件
- powershell - 如何将多行批处理文件语句转换为 Powershell?
- google-analytics - 在 GTM 创建虚拟页面并将其发送到 GA 的问题
- python-3.6 - 为什么 -1*List 对象返回一个空列表?
- sql-server - 签名存储过程和应用程序角色安全冲突
- python - 如何在 docker 容器中使用相机