Elixir 理解的范围界定问题
我想对一系列值的组合进行一些分析 我有以下函数,但由于某种原因,在理解完成后,在函数体的末尾,变量Elixir 理解的范围界定问题,elixir,Elixir,我想对一系列值的组合进行一些分析 我有以下函数,但由于某种原因,在理解完成后,在函数体的末尾,变量analytics仍然是一个空列表,而它不在每次迭代的理解范围内 有什么想法吗 def handle_cast({:start}, state) do intervals = [7, 30, 90] groupings = ["day_of_week", "time_of_day"] aggregators = [ %{ domain: "supp
analytics
仍然是一个空列表,而它不在每次迭代的理解范围内
有什么想法吗
def handle_cast({:start}, state) do
intervals = [7, 30, 90]
groupings = ["day_of_week", "time_of_day"]
aggregators = [
%{
domain: "support",
metric: "new_conversations",
func: &App.get_new_conversations/2
},
%{
domain: "support",
metric: "closed_conversations",
func: &App.get_closed_conversations/2
},
%{
domain: "support",
metric: "median_response_time",
func: &App.get_median_response_time/2
},
]
Repo.transaction(fn ->
Repo.delete_all(Analytic)
analytics = []
for interval <- intervals do
for grouping <- groupings do
for %{domain: domain, metric: metric, func: func} <- aggregators do
analytic =
func.(grouping, interval)
|> Enum.map(fn %{"app_id" => app_id, "data" => data} = result ->
%Analytic{app_id: app_id, domain: domain, metric: metric, grouping: grouping, interval_in_days: interval, data: data}
end)
analytics = [analytic|analytics]
end
end
end
end)
{:noreply, state}
end
def handle_cast({:start},state)do
间隔=[7,30,90]
分组=[“一周中的一天”、“一天中的时间”]
聚合器=[
%{
域名:“支持”,
指标:“新对话”,
func:&App.get\u new\u conversations/2
},
%{
域名:“支持”,
指标:“已结束的对话”,
func:&App.get\u关闭\u对话/2
},
%{
域名:“支持”,
指标:“响应时间中位数”,
func:&App.get\u median\u response\u time/2
},
]
回购交易(fn->
回购全部删除(分析)
分析=[]
对于间隔数据}=结果->
%分析{app_id:app_id,domain:domain,metric:metric,grouping:grouping,interval_in_days:interval,data:data}
(完)
分析=[分析|分析]
结束
结束
结束
(完)
{:诺雷普利州}
结束
Elixir中的变量是不可变的,但可以重新绑定。这意味着行analytics=[analytic | analytics]
正在为该块的范围创建一个新列表,并将其绑定到名为analytics
的变量。当块结束时,更改不会保留在的下一次迭代中。例如:
iex(1)> x = 1
1
iex(2)> for i <- 1..3 do
...(2)> IO.puts(x); x = x + i; IO.puts(x)
...(2)> end
1
2
1
3
1
4
但是,有一个简单的解决方案<代码>for接受多个for i
%分析{app_id:app_id,domain:domain,metric:metric,grouping:grouping,interval_in_days:interval,data:data}
(完)
结束
结束
结束
这将为您提供最有可能从原始代码中获得的相同输出
iex(1)> for i <- 1..2 do
...(1)> for j <- 1..2 do
...(1)> for k <- 1..2 do
...(1)> {i, j, k}
...(1)> end
...(1)> end
...(1)> end
[[[{1, 1, 1}, {1, 1, 2}], [{1, 2, 1}, {1, 2, 2}]],
[[{2, 1, 1}, {2, 1, 2}], [{2, 2, 1}, {2, 2, 2}]]]
iex(1)> for i <- 1..2, j <- 1..2, k <- 1..2 do
...(1)> {i, j, k}
...(1)> end
[{1, 1, 1}, {1, 1, 2}, {1, 2, 1}, {1, 2, 2}, {2, 1, 1}, {2, 1, 2}, {2, 2, 1},
{2, 2, 2}]
analytics =
for interval <- intervals,
grouping <- groupings,
%{domain: domain, metric: metric, func: func} <- aggregators do
func.(grouping, interval)
|> Enum.map(fn %{"app_id" => app_id, "data" => data} = result ->
%Analytic{app_id: app_id, domain: domain, metric: metric, grouping: grouping, interval_in_days: interval, data: data}
end)
end
end
end