在 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"}}
Run Code Online (Sandbox Code Playgroud)
Map.put/3考虑到它们的输入和结果非常相似,为什么不定义此函数?
小智 5
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
Run Code Online (Sandbox Code Playgroud)
Maps 和 Keyword 列表都支持访问行为,因此 put_in 不是 Maps 独有的,因此位于 Kernel 模块中。
关键字列表中的用法示例:
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]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |