Size: a a a

Эликсир и Вунш

2018 May 23

AB

Alexey Bolshakov in Эликсир и Вунш
вот cond do даже как-то более близок к case, чем if
источник

AB

Alexey Bolshakov in Эликсир и Вунш
if можно использовать в однострочку. как замену сишной затычке типа a = (cond) ? x : y;
источник

A

Anatoliy Kovalchuk in Эликсир и Вунш
foo?() && bar() || zar()
источник

AP

Artur Plysyuk in Эликсир и Вунш
источник

AB

Alexey Bolshakov in Эликсир и Вунш
params    = if parameters[:params]==nil, do: %{}, else: parameters[:params]
источник

A

Anatoliy Kovalchuk in Эликсир и Вунш
params = Map.fetch parameters, :params, %{}
источник

DS

Dmitry Shpagin in Эликсир и Вунш
nil[«params»] # => nil
источник

K

Konstantin in Эликсир и Вунш
if/case очень интересная тема, тут есть несколько интересных нюансов
1. if/unless - это не конструкция языка, это просто макрос
2. if/unless сделаны не просто чтоб проверять значения (как в других языках), а больше для выполнения доп кода по ходу функции
def some(file) do 
 if !File.exist?(file), do: File.create()
 // working with file
end


3 case - это как раз структура языка и основывается на паттерн матчинге (и работает очень быстро)
4. почти всегда в исходниках самого elixir используется case для проверки true -> и только в части Mix - используется if else для возвращения значений функций
https://github.com/elixir-lang/elixir/blob/26d53e60a718d34c4dc723811d924d58288282ab/lib/elixir/lib/file/stream.ex#L87

https://github.com/elixir-lang/elixir/blob/ab302d23e4b632486645cdf0fcc392e66b7abb99/lib/mix/lib/mix/tasks/deps.get.ex#L30
источник

DS

Dmitry Shpagin in Эликсир и Вунш
Dmitry Shpagin
nil[«params»] # => nil
поэтому params = parameters[:params] || %{}
источник

DS

Dmitry Shpagin in Эликсир и Вунш
Konstantin
if/case очень интересная тема, тут есть несколько интересных нюансов
1. if/unless - это не конструкция языка, это просто макрос
2. if/unless сделаны не просто чтоб проверять значения (как в других языках), а больше для выполнения доп кода по ходу функции
def some(file) do 
 if !File.exist?(file), do: File.create()
 // working with file
end


3 case - это как раз структура языка и основывается на паттерн матчинге (и работает очень быстро)
4. почти всегда в исходниках самого elixir используется case для проверки true -> и только в части Mix - используется if else для возвращения значений функций
https://github.com/elixir-lang/elixir/blob/26d53e60a718d34c4dc723811d924d58288282ab/lib/elixir/lib/file/stream.ex#L87

https://github.com/elixir-lang/elixir/blob/ab302d23e4b632486645cdf0fcc392e66b7abb99/lib/mix/lib/mix/tasks/deps.get.ex#L30
источник

K

Konstantin in Эликсир и Вунш
я вообще для себя давно понял, что если я не уверен, как делать лучше, открывать исходники elixir и искать подобный кейс. почти всегда работает безотказно
источник

ДМ

Дмитрий Макаренко in Эликсир и Вунш
Dmitry Shpagin
Всем привет!

Кто какой вариант читаемей считает?

case foo?() do
  true -> bar()
  false -> zar()
end


или
if foo?() do
  bar()
else
  zar()
end
Первый вариант. Во-первых это красиво выглядит. Человеки любят симетрию.  Глаз радуется.
Во-вторых, как я бы это прочитал: "варианты истинности результатов foo - это bar или zar. Конец."
источник

Е

Евгений in Эликсир и Вунш
У истины есть вариации?
источник

K

Konstantin in Эликсир и Вунш
ну и еще мои 5 копеек.
Очень много раз натыкался на то, что просят избегать использование if/else
Самый true elixir way - считается (не истина в последней инстанции) создание доп функций с паттерн матчингом

def get_message(a, b) when a > b do
 :ok
end

def get_message(a, b) do
 :error
end
источник

AP

Artur Plysyuk in Эликсир и Вунш
nil :D
источник

AP

Artur Plysyuk in Эликсир и Вунш
if nil, do: 1
источник

K

Konstantin in Эликсир и Вунш
Евгений
У истины есть вариации?
всегда
источник

DS

Dmitry Shpagin in Эликсир и Вунш
Konstantin
ну и еще мои 5 копеек.
Очень много раз натыкался на то, что просят избегать использование if/else
Самый true elixir way - считается (не истина в последней инстанции) создание доп функций с паттерн матчингом

def get_message(a, b) when a > b do
 :ok
end

def get_message(a, b) do
 :error
end
а мне паттернматчинг функций как-то не зашел, предпочитаю 1 точку входа
источник

ДМ

Дмитрий Макаренко in Эликсир и Вунш
Евгений
У истины есть вариации?
Вариантов нет, если ты живёшь в мире не единиц и нулей, а только единиц.
источник

K

Konstantin in Эликсир и Вунш
Dmitry Shpagin
а мне паттернматчинг функций как-то не зашел, предпочитаю 1 точку входа
как и везде, очень сильно зависит от сложности логики. Если она есть - то лучше бить по функциям, чтоб все просто читалось, если там простой очень кейс, то можно и if/else в inline (тоже кстати частенько используется в самом языке)
В виде
loaded_opts = if only = opts[:only], do: [env: :"#{only}"], else: []
источник