可变Arity Elixir函数的最佳实践?

时间:2017-04-19 08:20:24

标签: elixir

在没有造成不必要的复杂性的情况下,在Elixir中处理变量arity的最佳实践是什么?案例匹配下线?

Python示例:

def function_with_optional_param(param1, param2, param3=None):
    if not param3:
        param3 = "Whatever"

    return

如何在Elixir中最好地处理param3?

2 个答案:

答案 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

但实际上它创建了两个函数 - 一个有两个参数,另一个有三个。