例如,Integer.parse/2
函数的基数默认值为10,而String.to_integer/1
和String.to_integer/2
都存在,其中第二个用于base
时需要指定。
有没有理由以这种方式实施? 我应该何时使用其中一个来定义函数?
我的假设答案是,不同的arities的实现存在一些实际差异,而默认值版本共享相同的实现。但是,我不知道为什么在这种情况下会有不同的实现,特别是。
答案 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)
在我看来,这种做法仍然存在,因为使用多个函数头编写的函数来容纳默认参数允许编写比//
样式的默认参数更清晰的保护条款。
此外,因为在Erlang中定义了多个头部的函数(参考编写了大量的Elixir代码),直接翻译可以保留不成比例的代码而不需要//
。