Условно добавить в список в Elixir? - PullRequest
0 голосов
/ 19 апреля 2020

Я работаю над кодом Elixir через несколько месяцев на Python, и моя память о идиоматическом c Elixir размыта.

Этот код работает:

# Define workers and child supervisors to be supervised
children = [
  # Start the Ecto repository
  supervisor(Ssauction.Repo, []),
  # Start the endpoint when the application starts
  supervisor(SsauctionWeb.Endpoint, []),

  supervisor(Absinthe.Subscription, [SsauctionWeb.Endpoint]),
]

children
= if System.get_env("PERIODIC_CHECK") == "ON" do
    Enum.concat(children, [worker(Ssauction.PeriodicCheck, [])])
  else
    children
  end

Но я уверен, что это неловко. Как можно переписать это идиоматически?

1 Ответ

2 голосов
/ 20 апреля 2020

Вы можете определить вспомогательную функцию, которая принимает условное выражение:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...