我目前正在处理日期,我希望以一天的增量在两个日期之间进行迭代。我的价值观是
timezone =
case extractor.timezone do
nil -> "Etc/UTC"
_ -> extractor.timezone
end
start_date =
extractor.from_date
|> Ecto.DateTime.to_erl
|> Calendar.DateTime.from_erl!(timezone)
end_date =
extractor.to_date
|> Ecto.DateTime.to_erl
|> Calendar.DateTime.from_erl!(timezone)
total_days = find_difference(end_date, start_date)
IO.inspect iterate(schedule["Friday"], start_date, timezone)
我这样做的目的是,我将在开始和结束日期之间进行迭代。在开始日期增加一天的同时,日历将会获取日期Calendar.Date.day_of_week_name
的星期几,并将其传递给日程安排。
现在我正在尝试创建一个可能从开始日期到结束日期Enum
的循环现在对我没有帮助。任何其他建议我如何创建循环?对于日期
更新: 我试图以这种方式循环
for _ <- 1..total_days do
day_of_week = start_date |> Calendar.Date.day_of_week_name
IEx.pry
IO.inspect iterate(schedule[day_of_week], start_date, timezone)
start_date = start_date |> Calendar.DateTime.to_erl |> Calendar.DateTime.from_erl!(timezone, {123456, 6}) |> Calendar.DateTime.add!(86400)
end
但是当循环再次启动时,它不会取值new start_date?
答案 0 :(得分:1)
当然,事实并非如此。与任何其他功能语言一样,Elixir 没有可变变量。在最后一行中分配的局部变量start_date
的范围是do
- end
块。基本上,你正在做的是产生一个立即GC的新局部变量。
要收集一个值,需要一个带累加器的循环,例如: G:
1..total_days |> Enum.reduce(start_date, fn i, acc ->
day_of_week = acc |> Calendar.Date.day_of_week_name
IEx.pry
IO.inspect iterate(schedule[day_of_week], start_date, timezone)
acc |> .......
end)
现在,从块中接收值的累加器acc
(最后一行结果)将存储并传递start_date
。
Sidenote :对于那些来自可变对象的语言来说,这看起来很混乱,但是
a = a + 1
Elixir 中的不会更改a
a
,为其分配前变量a
的值。此行中LHO a
和RHO a
之间没有任何关联。