Эликсир кейс - PullRequest
       21

Эликсир кейс

0 голосов
/ 18 февраля 2019

Я написал следующее:

case length(clicks) do
      0 ->
        date_list = []
      1 ->
        date_list = start_date
      _ ->
        date_list = Interval.new(from: start_date, until: end_date) |> Enum.to_list
    end

Кажется, что date_list никогда не устанавливается.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Хотя ответ Дениса технически верен, использование Kernel.length/1 в целом является плохой практикой, поскольку обходит весь список .

Использовать прямойВместо этого сопоставление с образцом:

date_list =
  case clicks do
    [] -> []
    [_] -> start_date
    [_ | _] -> 
      [from: start_date, until: end_date] 
      |> Interval.new()
      |> Enum.to_list()
  end

Также обратите внимание, что правила Elixir заставляют запускать канал с необработанным значением , а всегда используют скобки в вызовахfunctions.


В соответствии с проблемой определения объема в вашем первоначальном вопросе, поскольку в Elixir нет присваивания переменной , а также нет переменных вообще , компилятор не может иметь локальный шредингер date_list.Помните: date_list = ... это не назначение, это повторное связывание .

0 голосов
/ 18 февраля 2019

Вы присваиваете внутренние переменные внутри оператора case.Присвойте переменную внешне так:

date_list = case length(clicks) do
    0 ->
      []
    1 ->
      start_date
    _ ->
      Interval.new(from: start_date, until: end_date) |> Enum.to_list
  end
...