gpt4 book ai didi

elixir - 带有可选键的模式匹配映射

转载 作者:行者123 更新时间:2023-12-03 14:54:14 25 4
gpt4 key购买 nike

我有一个接收带有许多键的 map 的功能,其中一些是可选的。如何在允许可选键默认为某些东西的同时编写理解 map 的函数签名?

def handle_my_map(%{text: text, 
print_times: print_times, # this I want to default to 2
color: color # this I want to default to "Blue"
}) do
Enum.each(1..print_times, fn (_) -> IO.puts ["(", color, "): ", text] end)
end

Test.handle_my_map(%{text: "here", print_times: 5, color: "Red"})
# (Red): here
# (Red): here
# (Red): here
# (Red): here
# (Red): here

handle_my_map(%{text: "there"})
# => MatchError!

我希望它是:

handle_my_map(%{text: "where", print_times: 3})
# (Blue): where
# (Blue): where
# (Blue): where
handle_my_map(%{text: "there"})
# (Blue): there
# (Blue): there

类似于 ruby​​ 的关键字参数:

def handle_my_map(text: nil, print_times: 2, color: 'Blue')

最佳答案

您可以使用 Map.merge/2 :

defmodule Handler do
@defaults %{print_times: 2, color: "Blue"}

def handle_my_map(map) do
%{text: text, print_times: times, color: color} = merge_defaults(map)
Enum.each(1..times, fn (_) -> IO.puts ["(", color, "): ", text] end)
end

defp merge_defaults(map) do
Map.merge(@defaults, map)
end
end

如果要允许 nil,可以使用 Map.merge/3并更改 merge_defaults/1到:

defp merge_defaults(map) do
Map.merge(@defaults, map, fn _key, default, val -> val || default end)
end

关于elixir - 带有可选键的模式匹配映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24775701/

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