gpt4 book ai didi

Elixir:如何处理函数和 nil 值中的可选/默认参数?

转载 作者:行者123 更新时间:2023-12-04 10:35:52 25 4
gpt4 key购买 nike

我有一个关于默认参数和 nil 值的一般性问题。假设我有两个功能。一个调用另一个(这是一个辅助函数)。两者都有一个可选参数。

辅助函数只是将列表连接到带有连接器的字符串。 joiner 被传递给 opts 关键字列表中的第一个函数。 joiner 的传递是可选的,默认为 "AND"

defmodule ParamTest do
def func_1(list, opts \\ []) do
helper(list, opts[:joiner])
# Do something else with the result
end

defp helper(list, joiner \\ "AND") do
Enum.join(list, " #{joiner} ")
end
end

# Example 1
["el 1", "el 2"]
|> ParamTest.func_1(joiner: "AND")
# Result "el 1 AND el 2"

# Example 2
["el 1", "el 2"]
|> ParamTest.func_1
# Result: "el 1 el 2"
# But it should be also "el 1 AND el 2"

问题是: opts[:joiner] 在第二个示例中将为零。但它仍然存在,因此不会使用默认值。

一种可能的解决方案是使用 case :
defmodule ParamTest do
def func_1(list, opts \\ []) do
case is_nil(opts[:joiner]) do
true -> helper(list)
false -> helper(list, opts[:joiner])
end
# Do something else with the result
end

defp helper(list, joiner \\ "AND") do
Enum.join(list, " #{joiner} ")
end
end

另一种方法是为帮助程序使用两个函数定义并使用模式匹配:
defmodule ParamTest do
def func_1(list, opts \\ []) do
case is_nil(opts[:joiner]) do
true -> helper(list)
false -> helper(list, opts[:joiner])
end
end

defp helper(list, nil) do
Enum.join(list, " AND ")
end

defp helper(list, joiner \\ "AND") do
Enum.join(list, " #{joiner} ")
end
end

但我觉得这不是很优雅,在更复杂的情况下可能会变得困惑。

对于这种情况,有什么更好的解决方案?

最佳答案

最好的解决方案是在 helper 中强制 joiner 并在 func_1 中提供默认选项。 .

def func_1(list, opts \\ [joiner: "AND"]) do
helper(list, opts[:joiner])
...
end
defp helper(list, joiner) do
...
end

始终尝试将您的担忧分开。 helper不是您的公共(public) API 的一部分,因此您始终可以传递所有选项。让它做它的工作而不用担心默认值。
func_1是您的公共(public) API,它应该担心默认值。您想在默认情况下指定“AND”连接符,所以不要默认为空选项列表。当开发人员阅读您的代码时,他们不需要更深入地检查“AND”的来源,并且可以很容易地弄清楚,他们可以通过此选项而无需阅读文档甚至函数体。

通常最好在顶层函数(API)中使用默认值,以便于使用,然后明确地传递所有内容。否则,您必须检查每个级别,如果该选项像您在示例中所做的那样通过 case .这很容易出错。

关于Elixir:如何处理函数和 nil 值中的可选/默认参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36330010/

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