在Elixir中设置现有的struct值?

Mol*_*árk 13 elixir

是否可以在现有结构中设置值?我在谈论将现有结构传递给函数并设置结构"名称"值(例如)的想法?

我有什么:main.exs

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

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

IO.write inspect person1
Run Code Online (Sandbox Code Playgroud)

user.exs

defmodule User do
    defstruct [name: ""]

    def constructor(name) do
        %User{name: name}
    end
end
Run Code Online (Sandbox Code Playgroud)

有什么办法让这个想法有效吗?

def setName(struct, newName) do
    struct.name = newName
end
Run Code Online (Sandbox Code Playgroud)

谢谢

Chr*_*nzo 16

绝对.有几种方法可以实现.

defmodule User do
  defstruct name: nil

  # Method 1
  def set_name(user, name) do
    %{user | name: name}
  end

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

  # Method 3
  def set_name(user, name) do
    user |> Map.put(:name, name)
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 请注意,作为所有Elixir数据结构的结构是不可变的,因此所有这些实际上创建了一个新的Struct,其中所有字段都具有与旧值相同的值,除了名称设置为新值. (3认同)
  • 另请注意,所有方法都有细微差别,尤其是在设置无效密钥时.当尝试设置不存在的键时,方法1将会出现(因为结构具有无效键的所有键都会失败),方法2将默默地丢弃所有无效键,方法3将只设置值并可能留下一个结构无效.所以,请不要使用`Map.put`!最后,另一种可能的方法是`Map.update!`,它等同于方法1. (2认同)
  • @molnarpw请记住,如果它能帮到你,你可以接受答案. (2认同)