Ein einfaches Protokoll ergibt zwei Arten von Dialysatoren Warnungen:Wie vermeidet man Dialyzer-Fehler für Protokolle?
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
Die Warnung, die ich nicht herausfinden kann, ist dies:
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},...]
Ich kann auch nicht ein @spec
herauszufinden, die Arbeit würde hier, um die Warnung zum Schweigen zu bringen.
Die andere Art der Warnung wurde an anderer Stelle diskutiert - viele "unbekannte Funktionen" aufgelistet:
Unknown functions:
'Elixir.Dtest.Valid.Atom':'__impl__'/1
'Elixir.Dtest.Valid.BitString':'__impl__'/1
(etc.)
Gibt es eine @spec
, die mit defprotocol
‚s verwendet werden kann? Ich habe keine Beispiele gefunden. Oder gibt es einen Weg, im Quellcode die defprotocol
zu markieren, um vom Dialysator ignoriert zu werden?
EDIT: Hier ist die vollständige Lösung für den ersten Fehler:
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
Können Sie einen Blick darauf werfen und sehen, ob dieser kürzlich erstellte Fehler damit zusammenhängt? http://bugs.erlang.org/browse/ERL-159 – aronisstav
@aronisstav das ist eine Regression in Erlang 19. Ich sehe das in 18, also wahrscheinlich nicht. –