Size: a a a

2021 April 17

LL

Lama Lover in pro.elixir
Смотря как её использовать
источник

М

Мерль🛠 in pro.elixir
Неа, особой связи не заметил
источник

VS

Vladimir Sekisov in pro.elixir
Попробуйте добавить when is_integer на вторую ветку,
чтобы не иметь сомнений.
источник

P

Pavel in pro.elixir
А что в спеках foo ?
источник

AI

Alexis IV Mobius in pro.elixir
Вероятно, его анализ по веткам кода foo показал, что они все неуспешны, кроме той, к-рая возвращает nil. Например, возвращает не тип, объявленный в спеке, а что-то другое.
источник

AI

Alexis IV Mobius in pro.elixir
Попробуйте -Wunderspecs.
источник

Е

Евгений in pro.elixir
Я упростил немного пример. Нашел блядскую ошибку. Диалайзер как обычно пишет говно, вместо реальной ошибки.
источник

Е

Евгений in pro.elixir
короче в реальности foo возвращает либо мапу, либо nil
источник

Е

Евгений in pro.elixir
причем мапу с обязательными ключами прописанными в спеке
источник

Е

Евгений in pro.elixir
один ключ забыли впихнуть в мапу. И диалайзер вместо того чтобы ругаться на foo, типа у вас тут ключ должен быть в мапе, а по факту его нет, гнал полную фигню насчет гарантированного nil
источник

Е

Евгений in pro.elixir
Причем раньше не ругался тоже. А тут на тебе
источник

Е

Евгений in pro.elixir
Ща попробую даже тесткейс накидать
источник

Е

Евгений in pro.elixir
Короче, вот коротенький пример:
  @spec foo(integer() | nil) :: %{a: integer(), b: integer()} | nil
 def foo(nil), do: nil
 def foo(a), do: %{a: a}

 def bar(a) do
   case foo(a) do
     nil -> :error
     _ -> :ok
   end
 end
источник

Е

Евгений in pro.elixir
И эта сволочь не пишет, что спека foo не совпадает с реальным результатом
источник

Е

Евгений in pro.elixir
А пишет бред:
The pattern
:variable_

can never match, because previous clauses completely cover the type
nil.
источник

Е

Евгений in pro.elixir
Как одно следует из другого я хз
источник

VS

Vladimir Sekisov in pro.elixir
Спека совпадает, чтобы не совпадала надо required (:b) =>,
так как матчинг никак не специфицирован, то он предупреждает, что ветки перекрываются
источник

AI

Alexis IV Mobius in pro.elixir
диалайзер предполагает, что когда твоя функция возвращает что-то, что у неё не указано в спеке, то это error path и учитываться не должно
источник

AI

Alexis IV Mobius in pro.elixir
через -Wunderspecs можно это поведение изменить, и он будет ругаться на foo
источник

Е

Евгений in pro.elixir
ЕМНИП синтаксис %{b: type} эквивалентен %{required(:b) => type}
источник