为什么一些Elixir库函数使用多个arities,而其他函数使用默认值?

时间:2017-07-18 21:58:07

标签: elixir default-arguments arity

例如,Integer.parse/2函数的基数默认值为10,而String.to_integer/1String.to_integer/2都存在,其中第二个用于base时需要指定。

有没有理由以这种方式实施? 我应该何时使用其中一个来定义函数?

我的假设答案是,不同的arities的实现存在一些实际差异,而默认值版本共享相同的实现。但是,我不知道为什么在这种情况下会有不同的实现,特别是。

2 个答案:

答案 0 :(得分:2)

它的内涵大致相同。在Elixir中指定默认参数时,会发生两个函数的创建。其中一个arity较少,arg设置为默认值,而另一个arnd设置为默认值 额外的arg。正如您可以通过内省Integer模块看到的那样 export parse / 1和parse / 2。

iex(2)> Integer.module_info(:exports)
[__info__: 1, digits: 1, digits: 2, floor_div: 2, "MACRO-is_even": 2,
 "MACRO-is_odd": 2, mod: 2, parse: 1, parse: 2, to_char_list: 1, to_charlist: 1,
 to_charlist: 2, to_string: 1, to_string: 2, undigits: 1, undigits: 2,
 module_info: 0, module_info: 1 ]

String.to_integer的情况下,作者决定更明确地反映出实现这一点的底层Erlang函数的包装。

答案 1 :(得分:2)

Functions accepting default arguments are transformed into multiple functions with corresponding arities

在我看来,这种做法仍然存在,因为使用多个函数头编写的函数来容纳默认参数允许编写比//样式的默认参数更清晰的保护条款。

此外,因为在Erlang中定义了多个头部的函数(参考编写了大量的Elixir代码),直接翻译可以保留不成比例的代码而不需要//