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