为什么一些 Elixir 库函数使用多个参数,而其他的使用默认值?
Why do some Elixir library functions use multiple arities, while others use default values?
例如,Integer.parse/2
函数的base默认值为10,而String.to_integer/1
和String.to_integer/2
都存在,其中第二个用于[=13] =]需要指定。
这样实施有什么原因吗?
我什么时候应该使用其中之一来定义函数?
我假设的答案是,不同参数的实现存在一些实际差异,而默认值版本共享相同的实现。但是,我不知道为什么在这种情况下会有不同的实现,特别是。
其实本质上是一样的。当您在 Elixir 中指定默认参数时,会创建两个函数。 arg 设置为默认值的少一种,另一种采用
额外的arg。正如您通过检查 Integer 模块所看到的那样,它
导出 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 函数的包装。
在我看来,这种做法仍然存在,因为使用多个函数头编写的函数以容纳默认参数允许编写比 //
风格的默认参数更容易理解的保护子句。
此外,由于用多个头定义的函数在 Erlang 中很普遍(很多 Elixir 代码都是参考它编写的)直接翻译保留了不成比例的代码量而没有 //
。
例如,Integer.parse/2
函数的base默认值为10,而String.to_integer/1
和String.to_integer/2
都存在,其中第二个用于[=13] =]需要指定。
这样实施有什么原因吗? 我什么时候应该使用其中之一来定义函数?
我假设的答案是,不同参数的实现存在一些实际差异,而默认值版本共享相同的实现。但是,我不知道为什么在这种情况下会有不同的实现,特别是。
其实本质上是一样的。当您在 Elixir 中指定默认参数时,会创建两个函数。 arg 设置为默认值的少一种,另一种采用 额外的arg。正如您通过检查 Integer 模块所看到的那样,它 导出 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 函数的包装。
在我看来,这种做法仍然存在,因为使用多个函数头编写的函数以容纳默认参数允许编写比 //
风格的默认参数更容易理解的保护子句。
此外,由于用多个头定义的函数在 Erlang 中很普遍(很多 Elixir 代码都是参考它编写的)直接翻译保留了不成比例的代码量而没有 //
。