我有一个像这样的简单函数:
def extract_text({_, _, [text]}) when is_binary(text), do: text
def extract_text(_), do: nil
Run Code Online (Sandbox Code Playgroud)
我为其添加的规范是:
@spec extract_text(any) :: nil
@spec extract_text({any, any, [text]}) :: text when text: String.t
Run Code Online (Sandbox Code Playgroud)
但是当我运行拨号程序时,出现以下错误:
lib/foo/bar.ex:1:“Elixir.Foo.Bar”的重载合约:extract_text/1 具有重叠的域;此类合约目前不受支持,并且会被忽略
我想我明白其原因,但我无法真正想出解决方案。该功能的正确规格是什么?
您应该意识到,即使您定义了相同数量的多个函数(接受相同数量的参数),从外部世界来看,这也被认为只是一个函数。这意味着,您需要定义函数签名,并且只有这个函数签名应该定义类型规范。
请尝试以下操作:
@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
980 次 |
| 最近记录: |