Elixir-为什么这些重复的头文件没有编译器警告?

问题描述

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

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

我用匹配的参数列表制作了两个简单的函数,其中一个带有尾随的_参数,它们都发出了预期的警告。
warning: this clause cannot match because a prevIoUs clause at line 24 always matches

我还复制并粘贴了整个第一个函数标头和主体,没有进行任何更改,但仍然没有收到警告。

Elixir 1.7.4

解决方法

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

再现它的一个更简单的最小示例:

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