如何避免协议的Dialyzer错误?

时间:2016-06-06 23:54:34

标签: protocols elixir dialyzer

一个简单的协议产生两种透析器警告:

defmodule Dtest do
  defprotocol Valid do
    @doc "Returns true if data is in a valid state"
    def valid?(data)
  end

  defimpl Valid, for: Integer do
    def valid?(_), do: true
  end
end

我无法弄清楚的警告是:

dtest.ex:2: The specification for
'Elixir.Dtest.Valid':'__protocol__'/1 states that the function might
also return 'true' but the inferred return is 
'Elixir.Dtest.Valid' | 'false' | [{'valid?',1},...]

我也无法找到@spec在这里工作以消除警告。

另一种警告已在别处讨论过 - 许多"未知功能"列出:

Unknown functions:
  'Elixir.Dtest.Valid.Atom':'__impl__'/1
  'Elixir.Dtest.Valid.BitString':'__impl__'/1

(等)

@spec是否可以使用defprotocol?我还没有找到任何例子。或者,有没有办法在源代码中标记透析器忽略defprotocol

编辑:这是第一个错误的完整修复:

defmodule Dtest do
  defprotocol Valid do
    @doc "Returns true if data is in a valid state"
    @dialyzer {:nowarn_function, __protocol__: 1}
    def valid?(data)
  end

  defimpl Valid, for: Integer do
    def valid?(_), do: true
  end
end

1 个答案:

答案 0 :(得分:2)

我正在使用

  @dialyzer {:nowarn_function, __protocol__: 1}

现在在协议定义中。