2016-04-06 35 views
1

透析抱怨鳳凰模型時,他們通常的方式設置,即鳳凰透析變更集警告

def changeset(model, params \\ :empty) 
... 

的PARAMS指導模型是如何進行更新,以:作爲默認區分空帶有'params'的空白表單提交等於空的地圖。

透析器警告:

The call 'Elixir.Backend.Plot': 
changeset([email protected]::any(),'empty') will never return since it differs in the 2nd argument from the success typing arguments: 
(#{},#{}) 

如果我刪除了 ':空' 默認PARAM警告消失。

是否有一個規範滿足類型檢查器,同時保持通常的默認變更集功能?任何提示或指針?

+0

您可能還會覺得閱讀本文很有幫助:http://elixir-lang.org/getting-started/typespecs-and-behaviours.html –

回答

1

因爲我不知道您提供的確切類型規格,所以很難告訴您您應該如何處理這個問題。但是,我認爲如果您將第二個參數標記爲可能爲空映射,則它應該按照您的要求工作。

Look here。看起來好像地圖沒有被透析器特別支持,但似乎有一個相對簡單的解決方法。制定規範#{ any() => any() }但是,正如該消息中提到的那樣,它是否能用於空地圖還不完全清楚。


編輯:

看來,我在我的反應是有點不清楚。當我說「規範」時,我的意思是說,您在函數之上添加的註釋可以告訴透析器您希望函數的行爲。例如:

@spec get_short_name(Path.t)::Path.t 
    def get_short_name(path) when is_binary(path) do 

如果您還沒有指定任何@spec,那可能是您的問題。

在上面指定的情況下,我建議這樣的事情可能工作:

@spec changeset(#{any() => any()}, #{any() => any()})::returntype 
def changeset(model, params \\ :empty) 

你想要修改返回類型是任何類型變更回報,我不能告訴從你張貼的片段型號應該是什麼類型,所以我猜它是一張地圖。正如我所說,因爲我不知道你在做什麼改變的細節,並且因爲你似乎沒有指定@spec,所以我很難說。

+0

嘿,沒有應用規範,它只是香草代碼。理想情況下,我想保留:空原子,這不是一個空的地圖明顯... – user3264325

+0

@ user3264325看看我的編輯答案。順便說一句,真的不讚賞downvote。 –

+1

正如@OnorioCatenacci所指出的那樣,「changeset」有一個類型規範,它要求第二個參數是一個映射。如果你還想/必須允許原子「空」,則規範應該通過例如'map()| 「empty''。 – aronisstav