药剂案例陈述

时间:2019-02-18 14:20:31

标签: elixir

我写了如下声明:

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 :(得分:4)

虽然丹尼斯的答案在技术上是正确的,但使用Kernel.length/1通常是一个不好的做法,因为它会遍历整个列表。

使用直接模式匹配:

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

还请注意,Elixir准则强制使用原始值启动管道,并且在函数调用中始终使用括号


根据您最初提出的范围界定问题,由于Elixir中没有分配变量,并且根本没有变量,因此编译器无法使用本地Schrödingerdate_list。请记住:date_list = ...不是一项作业,它是重新绑定

答案 1 :(得分:3)

您正在“ case”语句中分配内部变量。像这样在外部分配变量:

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