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

问题描述 投票:0回答:1

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

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

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

先谢谢了。

elixir phoenix-framework
1个回答
1
投票

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

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


1
投票

如果你把它更多地看成是类型提示,可能会有帮助。 虽然它 模式匹配,这里的语法让我想起了其他语言(如 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{},用前者比较习惯。

© www.soinside.com 2019 - 2024. All rights reserved.