为什么赢得Elixir编译器会对某些"不匹配"功能?

时间:2017-04-22 07:40:39

标签: elixir

如果你在模块中编写这样的代码,Elixir会发出警告:

def func(_) do
  true
end

def func(m) when is_integer(m) do
  false
end

as:warning: this clause cannot match because a previous clause at line 1 always matches

这非常有用,尤其是在模块中有许多功能时。 但是在编写如下代码时:

def func(n) when is_integer(n) do
  true
end

def func(m) when is_integer(m) do
  false
end

这不会引发任何警告。 为什么不会这样,或者我误解了什么? (在某些情况下,哪一个可以匹配?)

1 个答案:

答案 0 :(得分:0)

在第一种情况下,实际上有一个函数子句在传递一个参数时匹配任何东西。在这一点上很明显,该功能的任何其他单一条款都是多余的。

在第二种情况下,系统会看到两个具有保护子句的单一功能。它没有进行详尽的静态分析来确定保护条款是相同的......保护条款表达式可能很复杂,我怀疑确保它们覆盖相同的基础是一个挑战。因此,所有编译器都能判断出两个函数是否匹配不同的情况并且不会发出警告。