在没有造成不必要的复杂性的情况下,在Elixir中处理变量arity的最佳实践是什么?案例匹配下线?
Python示例:
def function_with_optional_param(param1, param2, param3=None):
if not param3:
param3 = "Whatever"
return
如何在Elixir中最好地处理param3?
答案 0 :(得分:8)
这是Elixir中非常常见的模式。最后一个参数应该是一个列表(特定的关键字列表),默认值为[]
。在Elixir中,如果最后一个参数是关键字列表,则不需要在列表周围添加[]
。例如:
def do_lots(arg1, arg2, opts \\ []) do
one = opts[:one] || :default
two = opts[:two] # default to nil if it's not passed
# do something with arg1, arg2, one, and two
end
def my_func do
arg1
|> do_lots(2)
|> do_lots(49, one: :question)
|> do_lots(99, two: :agent)
|> do_lots(-1, one: 3, two: 4)
end
处理变量大小参数的另一个选项是将它们全部作为列表传递。这使得函数arity 1,您可以根据需要处理它们。
最后,您可以将部分或全部args作为地图传递。这样做的好处是允许您在地图上进行模式匹配,并根据地图中传递的键创建多个函数子句。
请注意,您无法在关键字列表上轻松匹配,因为它们与订单有关。
答案 1 :(得分:2)
最好的方法是使用默认参数:
def function_with_optional_param(param1, param2, param3 \\ "Whatever") do
# something
end
但实际上它创建了两个函数 - 一个有两个参数,另一个有三个。