Size: a a a

2021 January 06

ŹR

Źmićer Rubinštejn in pro.elixir
Ты покрываешь то, чего не может быть
источник
2021 January 07

AI

Alexis IV Mobius in pro.elixir
Борщевик Ёбаный
есть набор модулей, логика которых совсем общая за исключением sql запроса

например так

defmodule PersonLoader do
   use GenericLoader

   def query ///// sql query
 end


В общем модуле некоторый процессинг и в итоге вызывается DatabaseContext.update /// который по контракту возвращает супер простые {:ok, record()} | {:error, changeset()}.
Где changeset по-хорошему opaque, но оно ни в каком виде не работает
И DatabaseContext.update точно соответствует контракту, оно не рейзит эксепшены и учитывает все кейсы

но попытка в любом виде сделать
case
 DatabaseContext.update(blabla) do
 {:error, _} ->
 или {:error, %{errors: _}}
 и всегда с {:ok, _}
end
воз
вращает
{:ok, _
}

can never match the type

 {:error,
  %Ecto.Changeset{………
но я о
бработал этот кейс выше, {:error, _} точно его покрывает

И эту ошибку диалайзер бросает именно в месте подключения макроса, то есть в use GenericLoader на второй строке
а хуле ты матчишь opaque как мапу?
источник

AI

Alexis IV Mobius in pro.elixir
Борщевик Ёбаный
и я продолжу утверждать, что я не дебил, хотя понимаю причину, почему диалайзер показал ошибку
и показал он не ту ошибку

та функция, которая по контракту не рейзит действительно не рейзит, но есть нюанс
она дёргает функцию, у которой под капотом

case Enum.each(list, never_raising_function) do
 :ok -> :ok
 _ -> raise «error»
end


у Enum.each по контракту нет ничего, кроме :ok, и то, что мой коллега написал такой кейс— это пиздец
но
1) эта ветка реально никогда не выполнится
2) ошибка, с которой упал диалайзер неверная. в случае рейза вызывающая функция тоже упадёт следовательно там no_return()
и тут да, can never match the case говорит, что код мёртвый
источник

БЁ

Борщевик Ёбаный... in pro.elixir
Źmićer Rubinštejn
Дивлайзер тебе сказал, что {:error, _} никогда не будет. Где он соврал то?
Будет, конечно, оно может быть и бывает
И на этот кейс даже есть тесты
источник

БЁ

Борщевик Ёбаный... in pro.elixir
Alexis IV Mobius
а хуле ты матчишь opaque как мапу?
Я не матчу опак как мапу, когда я матчил на мапу тип был паблик
Это называется ебануть наугад
источник

БЁ

Борщевик Ёбаный... in pro.elixir
Alexis IV Mobius
и тут да, can never match the case говорит, что код мёртвый
Так в том-то и дело, что код не мёртвый. Именно эксепшен никогда не бросается, а обе ветки возвращаются, и на это есть тесты
источник

M

MrFlorius in pro.elixir
А есть zip который не дропал бы элементы списков, которые длинее, чем самый короткий, а вставлял бы дефолтное значение
источник

LL

Lama Lover in pro.elixir
A ß
записывайтесь в церковь святого диалайзера, короче
Удваиваю
источник

Е

Евгений in pro.elixir
Кто-нибудь использует "однокложные" with?
with {:ok, result} <- foo() do
 do_something(result)
end
вместо
case foo() do
 {:ok, result} -> do_something(result)
 error -> error
end
источник

Е

Евгений in pro.elixir
На одну строку короче :)
источник

IS

Ilya Shuma in pro.elixir
Удобно использовать в контроллерах вместе с action_fallback для обработки ошибок.
источник

P

Pavel in pro.elixir
with {:ok, result} <- foo(), do: do_something(result) еще короче можно, и при этом читаемое
источник

Е

Евгений in pro.elixir
Pavel
with {:ok, result} <- foo(), do: do_something(result) еще короче можно, и при этом читаемое
Если внутри только do_something(), то вполне.
источник

LL

Lama Lover in pro.elixir
Евгений
Кто-нибудь использует "однокложные" with?
with {:ok, result} <- foo() do
 do_something(result)
end
вместо
case foo() do
 {:ok, result} -> do_something(result)
 error -> error
end
Я использую, я, я!
источник

TC

Timofey Chernousov in pro.elixir
MrFlorius
А есть zip который не дропал бы элементы списков, которые длинее, чем самый короткий, а вставлял бы дефолтное значение
В интернетах советуют вот такое: https://gist.github.com/nathan-cruz77/586092fa2487da2bdd5603934e7db4ad
источник

AB

Alex Bubnov in pro.elixir
Работает только со списками.
источник

AB

Alex Bubnov in pro.elixir
Я бы сделал стрим, который сначала вычерпывает enumerable, а потом возвращает дефолт без конца
источник

ŹR

Źmićer Rubinštejn in pro.elixir
А вы знали, что внутри регулярки через сигил работает интерполяция? А я не знал….
~r/\d{#{digits}}/
источник

TC

Timofey Chernousov in pro.elixir
Alex Bubnov
Я бы сделал стрим, который сначала вычерпывает enumerable, а потом возвращает дефолт без конца
Тогда нужно знать какой из элементов самый длинный, чтоб его тоже не сделать бесконечным
источник

AB

Alex Bubnov in pro.elixir
Timofey Chernousov
Тогда нужно знать какой из элементов самый длинный, чтоб его тоже не сделать бесконечным
Да, это проблема. Тогда только свой zip_longest писать.
источник