4

シンプルなプロトコルでは、2 種類のダイアライザー警告が表示されます。

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また、警告を黙らせるためにここで機能する a もわかりませんでした。

他の種類の警告は、他の場所で議論されています – 多くの「未知の機能」がリストされています:

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
4

1 に答える 1

3

私は使用しています

  @dialyzer {:nowarn_function, __protocol__: 1}

今のところプロトコル定義で。

于 2016-06-17T01:11:41.687 に答える