用于创建新结构列表的 Elixir 列表理解

Elixir List Comprehension to Create a New List of Structs

我对 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 接受另一个函数,该函数 return 是一个结构列表。真正的实现调用数据库。此代码用于 ExUnit 测试,我正在尝试 return 一些存根数据。

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

** (Protocol.UndefinedError) protocol Enumerable not implemented for 
   %Holding{client_id: 1, company: "---", company_id: 1, revenue: 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