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

Emi*_*ily 6 elixir

在Elixir中处理变量arity的最佳实践是什么,而不会造成不必要的复杂性和案例匹配?

Python示例:

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

    return
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*len 8

这是Elixir中非常常见的模式.最后一个参数应该是一个列表(特定的关键字列表),默认值为[].在Elixir中,如果最后一个参数是关键字列表,则不需要[]在列表周围添加s.例如:

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
Run Code Online (Sandbox Code Playgroud)

处理变量大小参数的另一个选项是将它们全部作为列表传递.这使得函数arity 1,您可以根据需要处理它们.

最后,您可以将部分或全部args作为地图传递.这样做的好处是允许您在地图上进行模式匹配,并根据地图中传递的键创建多个函数子句.

请注意,您无法在关键字列表上轻松匹配,因为它们与订单相关.