在 Elixir 中设置现有的结构体值?

问题描述 投票:0回答:1

是否可以有一个在现有结构中设置值的函数? 我正在谈论将现有结构传递到函数中并设置该结构“名称”值(例如)的想法?

我有:

main.exs

  Code.require_file("user.exs") # Requiring in module

  person1 = User.constructor("Name") # Making a new user

  IO.write inspect person1

用户.exs

defmodule User do
  defstruct [name: ""]

  def constructor(name) do
    %User{name: name}
  end
end

有什么方法可以让这个想法发挥作用吗?

def setName(struct, newName) do
  struct.name = newName
end

谢谢

elixir
1个回答
23
投票

当然。有多种方法可以实现这一点。

方法1

当尝试设置结构中缺少的字段时,这将在编译时出错

  defmodule User do
    defstruct name: nil
    def set_name(user, name) do
      %{user | name: name}
    end
  end

方法2

这将默默地丢弃无效的密钥

    def set_name(user, name) do
      user |> struct(%{name: name})
    end

方法3

这会将无效的键输入到结构中

    def set_name(user, name) do
      user |> Map.put(:name, name)
    end

方法4和5

当尝试设置不在结构中的字段时,这些会引发运行时错误

    def set_name(user, name) do
      user |> struct!(%{name: name})
    end

    def set_name(user, name) do
      user |> Map.update!(:name, name)
    end
© www.soinside.com 2019 - 2024. All rights reserved.