
Никита
02.03.2018
15:08:07
если про кейз, то наш пример с Auth
case Repo.get(Auth, id) do
%Auth{} = auth -> {:ok, auth}
_ -> {:error, :auth_not_found}
end
И вот с такой функцией можно спокойно в with ловить {:ok, auth} а в фолбэк контроллере ошибку) и else(ы) не нужны)

Dmitry
02.03.2018
15:09:21
Я так иногда делаю

Никита
02.03.2018
15:09:35
а я всегда)
правда иногда грешу с if)

Google

Никита
02.03.2018
15:11:01
auth = Repo.get(Auth, id)
if auth, do: {:ok, auth}, else: {:error, :auth_not_found}
вот так с ифом)

Yuri
02.03.2018
15:12:39
блин, а что с if не так-то ?)))

Никита
02.03.2018
15:12:47
от лукавого
надо вообще cond все делать)))

Dmitry
02.03.2018
15:13:11
Не, конд это не то
Case - это православно
Вернее кошерно

Alexey
02.03.2018
15:14:53

Dmitry
02.03.2018
15:15:59
quote do
case unquote(condition) do
x when :"Elixir.Kernel".in(x, [false, nil]) -> unquote(else_clause)
_ -> unquote(do_clause)
end
end вот так выглядит код ифа
Нафига мне это использовать, если я сам могу написать

Yuri
02.03.2018
15:16:10
ясно, понятно

Dmitry
02.03.2018
15:16:14
case

Google

Никита
02.03.2018
15:18:00
ну вот теперь я и не буду ифы делать)))

john
02.03.2018
15:48:26
Пидарская штука
норм, штука на сам деле, зря ты так
возвращает либо экземпляр класса либо нил
все прекрасно матчится по этим двум кейзам
оки и прочие плюшки можешь сам добавить на основе этого матчинга
ну то что никита говорит что любой :error проваливается в фолбек контроллер, это он неправ, это он недоглядел

Dmitry
02.03.2018
15:49:49

john
02.03.2018
15:50:04
сам допиши тупл

Dmitry
02.03.2018
15:50:20
Ну так я и экто могу сам написать

john
02.03.2018
15:50:25
с чего бы экто должна возвращать тупл то?
пусть экземпляр класса вернет и довольно с нее
либо нил, все вполне понятно

Dmitry
02.03.2018
15:51:29
В эликсире нету классов
И экземпляров

john
02.03.2018
15:51:37
ой даниважно

Dmitry
02.03.2018
15:52:13
Экто делает запрос к бд

john
02.03.2018
15:52:15
вот ты говоришь тупл, а чо тупл то? чо сразу не вебстраницу то?

Dmitry
02.03.2018
15:53:03
Даже если по логике запрос пришёл и ничего не вернул, экто должна возвращать {:ok, nil}
Но никак не nil

john
02.03.2018
15:53:16
нил это ваще не ок

Dmitry
02.03.2018
15:53:26
Nil это ок
Если нету Some монады
А тут нету Some монады

Google

Dmitry
02.03.2018
15:54:03
Тут есть Result монада
Вот и весь ФП

john
02.03.2018
15:54:33
утибозеньки

Fey
02.03.2018
15:57:59
соглашусь насчёт {:ok, nil}, а то приходится такие ужасы творить:
with %User{} = user <- Repo.get(User, id) || {:error, :not_found}

Dmitry
02.03.2018
16:00:20
На самом деле тут ещё надо подумать, где ок-Нил, а где ошибка
Repo.one наверное можно и ошибкой седлать
Repo.get - хз
Repo.get_by - наверное ок-нил
Сделали чтобы одной строчкой выкинуть из контроллера во вью
И получилось неконсистентное шило
Но, че уж там - остаётся только пользоваться и все

john
02.03.2018
16:02:59
вот потому и не сделан тупл, потому что кейзы разные бывают
где то это ок, а гдето не ок
ну и еще куча всяких плюшек, экто - это не просто запрос в базу

Dmitry
02.03.2018
16:04:19
Все остальные плюшки экто возвращают тупл
Кроме 4 функций
all, one, get, get_by

john
02.03.2018
16:05:18
и ты не догадываешься почему?

Dmitry
02.03.2018
16:05:47
Я уже сказал почему

Google

Dmitry
02.03.2018
16:06:21
И почему это говно - тоже сказал

john
02.03.2018
16:06:49
ну раз не догадываешься - подсказывать не буду

Dmitry
02.03.2018
16:07:02
Ты вообще очень логичный

john
02.03.2018
16:16:25
хуцпа

Alister
02.03.2018
16:16:52

Vladimir
02.03.2018
16:42:31
нытьё. Есть разумная причина нелюбить HR, вот пусть ей и занимаются

Максим
02.03.2018
16:45:03
А в чем проблема непосредственно со _всеми_ HR

Vladimir
02.03.2018
16:53:36
не знаю в чём проблема со _всеми_ HR

abc
02.03.2018
17:48:30
Кто работает с монгой из эликсира ? что-то лучше чем это https://github.com/ankhers/mongodb есть ?

AndreyWIN
02.03.2018
20:16:51
iex>"Hello"<>" world"

Sergey
02.03.2018
20:27:16
10 CLS
20 PRINT "HELLO STRANGER"
30 END


Dmitry
02.03.2018
23:39:43
По поводу if - он иногда очень полезен, потому что позволяет в одну строчку или компактнее других альтернатив записать то, что с case-ом получится как минимум в 4-е, примеры:
decoding_opts = if atoms?, do: [keys: :atoms], else: [] # 1 строчка
decoding_opts = # 5 строчек
case atoms? do
true -> [keys: :atoms]
_ -> []
end
decoding_opts = decoding_opts(atoms?) # 4 строчки с учётом new line
defp decoding_opts(true), do: [keys: :atoms]
defp decoding_opts(false), do: []
if data, do: send(self(), {:request, pid, data}) # одна строчка, компактно и понятно
case data do # 4 строчки
data when is_binary(data) -> send(self(), {:request, pid, data})
nil -> nil
end
with data when is_binary(data) <- "", do: send(self(), {:request, pid, data}) # verbose и длинная
Ни в одном из примеров нет более компактной и понятной альтернативы if-у.

Fey
03.03.2018
00:24:05
decoding_opts = atoms? && [keys: :atoms] || []

Dmitry
03.03.2018
00:28:05
@feymartynov Намного менее понятно

Fey
03.03.2018
01:27:35
кому как. одним такая запись вполне понятна, а другие вообще тернарки не признают, даже с if

Dmitry
03.03.2018
03:31:09
@feymartynov Не согласен. Я посмотрел в своём коде и в коде библиотек, очень часто встречаю if - ни в своём коде, ни в коде всех используемых библиотек такого
&& ... ||
патерна нет. Встретил один раз такую комбинацию в коде самого Elixir-а. (Я думаю считать сколько раз используется if во всех этих проектах для сравнения не имеет смысла, так как несколько порядков чаще). Здесь слишком сильный, однозначный, неоспоримый перевес у if-а по сравнению с формой
&& ... ||
, чтобы говорить "кому как". Большинству однозначно всё-таки if намного понятнее, иначе бы другая форма использовалась бы активнее.