凤凰透析变更集警告

问题描述:

透析抱怨凤凰模型时,他们通常的方式设置,即凤凰透析变更集警告

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 –

因为我不知道您提供的确切类型规格,所以很难告诉您您应该如何处理这个问题。但是,我认为如果您将第二个参数标记为可能为空映射,则它应该按照您的要求工作。

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