功能重叠规格

时间:2017-08-28 08:53:02

标签: erlang elixir

我有一个像这样的简单函数:

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:重载合同   ' Elixir.Foo.Bar':extract_text / 1有重叠的域名;   此类合同目前不受支持,只是被忽略

我想我理解它的原因但我无法提出解决方案。这个函数的正确规范是什么?

1 个答案:

答案 0 :(得分:3)

你应该知道,即使你定义了同一个arity的多个函数(接受相同数量的参数),来自外部世界,这只被认为是一个函数。这意味着,您需要定义函数签名,并且只有这个应该定义类型规范。

尝试以下方法:

@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