2016-06-06 14 views
2

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 
+0

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

+0

@aronisstav das ist eine Regression in Erlang 19. Ich sehe das in 18, also wahrscheinlich nicht. –

Antwort

2

ich

bin mit jetzt
@dialyzer {:nowarn_function, __protocol__: 1} 

in der Protokolldefinition.

+0

Danke! Ich werde es versuchen. Wird dadurch das Problem vollständig behoben? – Dogweather

+0

Dies schlägt fehl, wenn ich es versuche: '{{nocatch, {Fehler," Unknown function '__protocol __'/1 in Zeile lib/dtest.ex: 1 "}}' – Dogweather

+0

Ah hah, so ** innerhalb ** der 'defprotocol '. – Dogweather

Verwandte Themen