在 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]]
在 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]]