Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 理解的范围界定问题_Elixir - Fatal编程技术网

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