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
Можете ли вы взглянуть, связана ли эта недавно созданная ошибка? http://bugs.erlang.org/browse/ERL-159 – aronisstav
@aronisstav, это регресс в erlang 19. Я вижу это в 18 лет, поэтому, вероятно, нет. –