2016-06-06 2 views
2

A дает простой протокол два вида диализатора предупреждений:Как избежать ошибок 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, чтобы игнорировать диализатор?

EDIT: Вот полное исправление для первой ошибки:

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

Можете ли вы взглянуть, связана ли эта недавно созданная ошибка? http://bugs.erlang.org/browse/ERL-159 – aronisstav

+0

@aronisstav, это регресс в erlang 19. Я вижу это в 18 лет, поэтому, вероятно, нет. –

ответ

2

Я использую

@dialyzer {:nowarn_function, __protocol__: 1} 

в определении протокола в настоящее время.

+0

Спасибо! Я попробую. Это полностью устраняет проблему? – Dogweather

+0

Это не удается, когда я пытаюсь: '{{nocatch, {error," Неизвестная функция '__protocol __'/1 в строке lib/dtest.ex: 1 "}}' – Dogweather

+0

Ага, поэтому ** в ** 'defprotocol '. – Dogweather