【问题标题】:Elixir - why is there no compiler warning for these duplicate headers?Elixir - 为什么这些重复的头文件没有编译器警告?
【发布时间】:2020-12-01 13:28:55
【问题描述】:

今天在浏览一些代码时,我遇到了以下两个函数头,并意识到,据我所知,它们应该是重复的。相同数量的参数,没有匹配或保护让我们绕过第一个。但是编译器并没有警告我第二个永远不会匹配。任何解释为什么会这样?

  def update_display_cache(context, text, line_no, position, text, adjusted_text, _) do
  def update_display_cache(context, display_line, line_no, position, text, adjusted_text, _) do

我创建了几个带有匹配参数列表的简单函数,包括一个带有尾随 _ 参数的函数,它们都给出了预期的警告。
warning: this clause cannot match because a previous clause at line 24 always matches

我还复制并粘贴了整个第一个函数的标题和正文,没有更改,但仍然没有收到警告。

灵药 1.7.4

【问题讨论】:

  • 只是为了确定......该函数是否定义在同一个模块中?你确定事情重新编译了吗? (有时删除 _build 目录是最终的检查)
  • 如果我错了,请纠正我,但据我所知,这两个函数具有相同数量的参数,没有警卫帮助区分它们。
  • 这个历史显然可以追溯到几年前通过几个模块,复制和粘贴。相信我,它已经重新编译了! @GuruStron 这就是问题的重点。除了名称,我看不出标题之间没有区别,那么为什么编译器不警告我呢?
  • @Sinc 是的,错过了有问题的“否”)

标签: elixir compiler-warnings


【解决方案1】:

参数text 在第一个定义中出现了两次,增加了这两个值必须相等才能匹配的额外约束。

重现它的更简单的最小示例:

  def equals?(a, a), do: true
  def equals?(_, _), do: false

【讨论】:

  • ?️ 敏锐的眼光! ?️
  • 哈哈 thx,实际上我花了一些时间才注意到 ;)
  • 谢谢@sabiwara,现在我可以回到我真正的工作中,不再盯着看!
  • 我对 Elixir 还很陌生,忘记了约束函数头的第三种方法:匹配、保护和重用变量名。再说一次,我的团队负责人已经做了几年 Elixir 并编写了原始代码,他没有发现为什么它们没有重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2018-08-31
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多