Elixir List Comprehension创建一个新的结构列表

时间:2017-06-08 08:38:25

标签: elixir list-comprehension mix ex-unit

我对Elixir很新,并试图使用列表理解产生一个新的结构列表,而对于我的生活,我似乎无法做到这一点:

holdings = ServiceX.update_holdings(
         fn() -> for n <- 1..3, do: n end,
         &(for n <- 1..100, do: %Holding {
                                  client_id: &1,
                                  company_id: n,
                                  company: "---",
                                  revenue: 0.0 }
         ))

update_holdings接受另一个返回结构列表的函数。真正的实现调用了数据库。此代码用于ExUnit测试,我尝试返回一些存根数据。

似乎我在这里遇到了明显的错误。这是我运行时遇到的错误:mix test

** (Protocol.UndefinedError) protocol Enumerable not implemented for 
   %Holding{client_id: 1, company: "---", company_id: 1, revenue: 0.0}

我是否错过了模块导入,或者如何使用列表推导生成结构列表?

1 个答案:

答案 0 :(得分:0)

代码不正确:

def update_holdings(f1, f2) do
     ids = f1.()
     for id <- ids,
         holdings <- f2.(id),
         holding <- holdings,
         do: holding
 end

问题是额外的嵌套枚举holding <- holdings。这是一个业余的错误,因为我误解了它在Elixir中是如何工作的。 将上面的内容改为以下修正了问题:

def update_holdings(f1, f2) do
     ids = f1.()
     for id <- ids,
         holding <- f2.(id),
         do: holding
 end