Вы можете определить вспомогательную функцию, которая принимает условное выражение:
defp append_if(list, condition, item) do
if condition, do: list ++ [item], else: list
end
И затем использовать его следующим образом:
[1,2,3]
|> append_if(true, 4)
|> append_if(false, 1000)
Производит:
[1, 2, 3, 4]
Похоже, вы используете модуль Supervisor.Spec
, который устарел. Вы можете определить свое дерево надзора более современным способом, например, так:
children =
[
Ssauction.Repo,
SsauctionWeb.Endpoint,
{Absinthe.Subscription, [SsauctionWeb.Endpoint]}
]
|> append_if(System.get_env("PERIODIC_CHECK") == "ON", Ssauction.PeriodicCheck)
Хотя вам, вероятно, придется изменить своих дочерних контролеров для реализации поведения Supervisor
.
Если вы собираетесь создавать большие списки, обычно нужно предварительно присоединиться к списку, а затем сделать один реверс результатов, чтобы избежать добавления, которое каждый раз пересекает весь список:
defp prepend_if(list, condition, item) do
if condition, do: [item | list], else: list
end
def build_list do
[]
|> prepend_if(true, 1)
|> prepend_if(true, 2)
|> prepend_if(true, 3)
|> prepend_if(false, nil)
|> prepend_if(false, 5000)
|> Enum.reverse()
end