Elixir:将具有字段的def结构作为其他结构类型的列表

时间:2019-07-14 22:07:22

标签: struct elixir

如果我具有以下结构:

defmodule Events.InviteEvent do
  defstruct [
    :event_id,
    :invite_list
  ]
end

是否可以将:invite_list定义为具有其他结构类型的列表?基本上,我想用以下结构定义一个结构:

{
event_id: 123,
invite_list: [
              {name: "jason", email: "myemail1@email.com"},
              {name: "judy", email: "myemail2@email.com"}
              ]
}

2 个答案:

答案 0 :(得分:1)

来自Structs

  

结构提供了编译时保证,只有通过defstruct定义的字段(及其所有全部)才允许存在于结构中

您获得的唯一保证是字段名称存在。无法指定值的类型。

您可以编写一个辅助函数来构建使用typespecs的结构,但这并不能给您任何额外的编译时或运行时保证。

答案 1 :(得分:0)

在实践中,我经常将列表添加到我的结构中。因此,假设您具有%Invite {}结构,我将编写以下内容:

defmodule Events.InviteEvent do

  defstruct [
    event_id: nil,
    invite_list: []
  ]

end

然后根据需要填充。

%Events.InviteEvent{
  event_id: 123, 
  invite_list: [
    %Invite{name: "jason", email: "myemail1@email.com"}, 
    %Invite{name: "judy", email: "myemail2@email.com"}
  ]

如果您需要注意,invoke_list仅包含%Invite {}的列表,请使用结构的接口进行管理。