这个Elixir函数中的(反向)赋值匹配有什么意义?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个Elixir函数中的(反向)赋值匹配有什么意义?相关的知识,希望对你有一定的参考价值。

我唯一的猜测是,它是为了验证它是一个结构,否则,它是什么?%User= user 做?

def change_user(%User = user) do
  User.changeset(user, %)
end

它来自凤凰框架和各种生成器等。

先谢谢了。

答案

是的,这将仅仅验证输入是否可以匹配到一个 %User 结构,而不是其他。

它的目的是识别bug(通过静态程序分析)或强制运行时错误崩溃,这样你的程序就不会做任何有害的事情(希望如此)。

另一答案

如果你把它更多地看成是类型提示,可能会有帮助。 虽然它 模式匹配,这里的语法让我想起了其他语言(如 php、Python 或 Go)在函数签名中加入数据类型的做法。

但既然是Elixir,它就是一个模式匹配,而且它是一种表达该特定函数子句意图或为自己定义其他函数子句做准备的习惯性方式。 例如,想象一下,在你提供的例子旁边定义这些功能子句。

def change_user(%LegacyUser = legacy_user) do
  LegacyUser.changeset(legacy_user, %)
end

def change_user(arg) do
  Logger.error("Unsupported argument given to change_user/1: #inspect(arg)")
end

虽然从功能上来说,如果你这样做并不重要 %User = useruser = %User,用前者比较习惯。

以上是关于这个Elixir函数中的(反向)赋值匹配有什么意义?的主要内容,如果未能解决你的问题,请参考以下文章

Elixir 中的命名函数和匿名函数有啥区别?

django 中的反向函数出错。无法匹配模式

Elixir中的“? s”是什么意思?

Elixir:模式匹配对元组和映射的工作方式不同

匹配 Elixir 二进制文件中的多个部分以解析 HTTP/2.0 帧

Elixir 列表模式匹配 ~ 在使用列表模式匹配常量后得到 x