【问题标题】:What is the point of this ( reverse ) assignment / matching in this Elixir function这个 Elixir 函数中这个(反向)赋值/匹配的意义是什么
【发布时间】:2020-05-14 13:22:07
【问题描述】:

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

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

来自 Phoenix 框架和各种生成器等...

提前致谢。

【问题讨论】:

  • 如果您对订单有疑问,%User{} = useruser = %User{} 的模式相同。
  • 绝不是一项任务。这是pattern matching。我建议从阅读语言指南开始,而不是深入研究框架。
  • 这允许通过模式匹配实现函数重载 - 请参阅:stackoverflow.com/questions/23600513/…

标签: elixir phoenix-framework


【解决方案1】:

是的,这只会验证输入可以匹配到/是%User{} 结构,没有别的。

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

【讨论】:

  • 主要是提供基于模式匹配参数为函数定义多个子句的能力。
【解决方案2】:

如果您将其更多地视为类型提示,这可能会有所帮助。虽然它模式匹配,但这里的语法让我想起了将数据类型放在函数签名中的其他语言(例如 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{} = user还是user = %User{},还是用前者更习惯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多