2017-08-28 59 views
1

我有这样一个简单的函数:功能重叠的规格

def extract_text({_, _, [text]}) when is_binary(text), do: text 
def extract_text(_), do: nil 

,我增加了它的规格是:

@spec extract_text(any) :: nil 
@spec extract_text({any, any, [text]}) :: text when text: String.t 

但是当我运行dializer,我得到以下错误:

lib/foo/bar.ex:1: Overloaded contract for 'Elixir.Foo.Bar':extract_text/1 has overlapping domains; such contracts are currently unsupported and are simply ignored

我想我理解它的原因,但我无法真正想出一个解决方案。什么是这个功能的正确规范?

回答

2

即使您定义了来自外部世界的相同参数的多个函数(接受相同数量的参数),您也应该意识到这仅被视为一个函数。这意味着,你需要定义函数签名,只有这个函数签名应该定义类型规范。

尝试以下操作:

@spec extract_text(any) :: String.t | nil 
def extract_text(arg) 

def extract_text({_, _, [text]}) when is_binary(text), do: text 
def extract_text(_), do: nil