使用在另一个函数中创建的项目将此项目添加到列表中

use item created in another function to add this item to a list

我正在尝试创建一个用户并将这个新用户添加到列表中。

每次创建新用户时,我都想将该新用户添加到现有列表中。

我的代码:

defmodule User do
  defstruct [:name, :city, company_code: 500]

  def create(params) do
    name = Keyword.get(params, :name)
    company_code = Keyword.get(params, :company_code)
    city = Keyword.get(params, :city)

    %Product{name: name, city: city, company_code: company_code}
  end

  def add_new_user(new_user, %User{}) do
    [:new_user | %User{}]
  end
end

如何获取 运行 def create 时得到的结果,并在每次使用 def create 创建用户时将其添加到列表中,并向所有用户显示该列表?

Elixir 作为第一语言可能具有挑战性,但它确实迫使您认真思考如何以及在何处传递值。

首先,您的 User 结构看起来像是来自 Product 结构的 copy-pasted,所以让我们简化示例:

defmodule User do
  defstruct [:first_name, :last_name]

  def create(params) do
    first_name = Keyword.get(params, :first_name)
    last_name = Keyword.get(params, :last_name)

    %User{first_name: first_name, last_name: last_name}
  end

  def add_user_to_list(new_user, list_of_existing_users \ []) do
    [new_user | list_of_existing_users]
  end
end

在这里,调用create/1,例如User.create(first_name: "Bob", last_name: "Smith") 将 return 一个 User 结构,例如%User{first_name: "Bob", last_name: "Smith"}.

如果要将其添加到列表中,可以将结构传递给 add_user_to_list/2 函数:

[%User{first_name: "Bob", last_name: "Smith"}] = User.add_user_to_list(%User{first_name: "Bob", last_name: "Smith"})

问题在于,如果您想添加其他用户,则必须跟踪 UPDATED 列表变量并将该 BACK IN 传递给 add_user_to_list/2 函数。例如

user_list = []
u1 = User.create(first_name: "Bob", last_name: "Smith")
user_list = User.add_user_to_list(u1, user_list)
u2 = User.create(first_name: "Jane", last_name: "Doe")
user_list = User.add_user_to_list(u2, user_list)
# ... etc...