我写了如下声明:
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
。我在做什么错了?
答案 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