我有一个像这样的简单函数:
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有重叠的域名; 此类合同目前不受支持,只是被忽略
我想我理解它的原因但我无法提出解决方案。这个函数的正确规范是什么?
答案 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