2017-08-28 61 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