在 Elixir 中,为什么 Kernel.put_in/3 定义在 Kernel 模块而不是 Map 模块?

In Elixir, why is Kernel.put_in/3 defined in the Kernel module rather than the Map module?

在 Elixir 中更新嵌套 Map 中的值时,我们可以使用 Kernel.put_in/3

map = %{hi: "what's", up: %{my: "boii"}}
%{hi: "what's", up: %{my: "boii"}}

Kernel.put_in(map, [:up, :my], "dawg") 
%{hi: "what's", up: %{my: "dawg"}}

考虑到它们的输入和结果非常相似,为什么不与 Map.put/3 一起定义此函数?

Kernel.put_in 函数在任何具有访问行为的结构中工作,根据它的文档:

@spec put_in(Access.t(), nonempty_list(term), term) :: Access.t()
def put_in(data, [_ | _] = keys, value) do
  elem(get_and_update_in(data, keys, fn _ -> {nil, value} end), 1)
end

地图和关键字列表都支持访问行为,因此 put_in 不是地图独有的,因此在内核模块中。

关键字列表中的用法示例:

iex(1)> Kernel.put_in([foo: 3], [:foo], 4)
[foo: 4]
iex(2)> Kernel.put_in([foo: [bar: 3]], [:foo, :bar], 4)
[foo: [bar: 4]]