如果你在模块中编写这样的代码,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
这不会引发任何警告。 为什么不会这样,或者我误解了什么? (在某些情况下,哪一个可以匹配?)
答案 0 :(得分:0)
在第一种情况下,实际上有一个函数子句在传递一个参数时匹配任何东西。在这一点上很明显,该功能的任何其他单一条款都是多余的。
在第二种情况下,系统会看到两个具有保护子句的单一功能。它没有进行详尽的静态分析来确定保护条款是相同的......保护条款表达式可能很复杂,我怀疑确保它们覆盖相同的基础是一个挑战。因此,所有编译器都能判断出两个函数是否匹配不同的情况并且不会发出警告。