gpt4 book ai didi

elixir - 实例化新结构时使用 `|`

转载 作者:行者123 更新时间:2023-12-04 23:19:41 25 4
gpt4 key购买 nike

以下代码是从 Manning 发布的“Elixir in Action”复制粘贴的。

defmodule TodoList do

defstruct auto_id: 1, entries: HashDict.new

def new, do: %TodoList{}

def add(
%TodoList{entries: entries, auto_id: auto_id} = todo_list,
entry) do
entry = Map.put(entry, :id, auto_id)
new_entries = HashDict.put(entries, auto_id, entry)
%TodoList{ todo_list |
entries: new_entries,
auto_id: auto_id + 1
}
end

end

我不明白 todo_list | 的用法末 add创建新时的函数 TodoList .我尝试完全删除它,但看不出结果有什么不同。谁能向我解释它正在实现什么?

最佳答案

这是更新 map 的速记语法:

iex> map = %{foo: "bar"}
%{foo: "bar"}

iex> map = %{map | foo: "quux"}
%{foo: "quux"}

请注意,与 Map.put/3 不同,您只能更新现有 key ,这为您提供了一些安全性。它的行为更像 Erlang 的 :maps.update/3 .
iex> map = %{map | baz: "quux"}
** (ArgumentError) argument error
(stdlib) :maps.update(:baz, "quux", %{foo: "bar"})
(stdlib) erl_eval.erl:255: anonymous fn/2 in :erl_eval.expr/5
(stdlib) lists.erl:1261: :lists.foldl/3

另请注意,像您的 %TodoList{} 这样的结构实际上只是映射,因此所有这些都与结构完全相同。

现在,因为您正在设置结构的所有有效键,所以是否放置 todo_list | 没有区别。现在在那里或不在那里。但是,如果将新 key 添加到结构中,您的 add功能可能不再按预期工作,丢弃其他键。所以我建议你把它留在那里。

关于elixir - 实例化新结构时使用 `|`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31073918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com