【问题标题】:Phoenix Dialyzer Changeset WarningPhoenix Dialyzer 变更集警告
【发布时间】:2016-04-07 20:15:02
【问题描述】:

Dialyzer 在以通常方式设置时抱怨 Phoenix 模型,即

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

params 指示如何更新模型,默认使用 :empty 来区分空白表单提交与 'params' 等于空映射。

透析器警告:

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

如果我删除 ':empty' 默认参数,警告就会消失。

是否有满足类型检查器的规范同时保持通常的默认变更集功能?任何提示或指针?

【问题讨论】:

标签: elixir phoenix-framework dialyzer


【解决方案1】:

由于我不知道您提供的确切类型规范,因此很难确切地建议您应该如何处理这个问题。但是,我认为如果您将第二个参数标记为可能是空地图,它应该可以按您的意愿工作。

看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)

您想将 returntype 修改为变更集返回的任何类型,我无法从您发布的片段中看出 model 的类型应该是什么,所以我猜是地图。正如我所说,由于我不知道您对变更集所做的详细信息,而且您似乎没有指定@spec,所以我很难说。

【讨论】:

  • 嘿,没有应用规范,它只是普通代码。理想情况下,我想保留 :empty atom,这显然不是一个空映射...
  • @user3264325 看看我对答案的编辑。顺便说一句,真的不喜欢downvote。
  • 正如@OnorioCatenacci 所暗示的,changeset 有一个类型规范,它要求第二个参数是一个映射。如果您还希望/必须允许原子empty,则规范应反映这一点,例如map() | 'empty'.
  • 投反对票的不是我! (我不太了解界面,这里是新的,但仔细检查了我的个人资料,实际上我以前从未在这里投票过任何东西:)将调查编辑后的回复并回复您。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2019-04-22
  • 1970-01-01
相关资源
最近更新 更多