2017-07-18 3 views
1

Als Beispiel hat die Funktion Integer.parse/2 einen Standardwert von 10 für die Basis, während String.to_integer/1 und String.to_integer/2 beide existieren, wobei die zweite verwendet wird, wenn base angegeben werden muss.Warum verwenden einige Elixir-Bibliotheksfunktionen mehrere Aritäten, während andere Standardwerte verwenden?

Gibt es einen Grund, dass es auf diese Weise implementiert wurde? Wann sollte ich das eine oder das andere verwenden, um Funktionen zu definieren?

Meine angenommene Antwort ist, dass es einen tatsächlichen Unterschied in der Implementierung für die unterschiedlichen Aritäten gibt, während die Standardversion die gleiche Implementierung hat. Ich weiß jedoch nicht, warum es in diesem Fall speziell eine andere Umsetzung geben würde.

Antwort

2

Es ist meist das Gleiche unter der Decke. Wenn Sie in Elixir ein Standardargument angeben, werden zwei Funktionen erstellt. Einer von einer Arity weniger mit dem Arg auf den Standard gesetzt und einer, der den zusätzlichen Arg. . Wie Sie sehen können, indem Sie das Integer-Modul untersuchen, exportiert es parse/1 und analysiert/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 ] 

Im Falle String.to_integer die Autoren entschieden mehr explict und spiegeln die Verpackung der zugrunde liegenden Erlang Funktionen zu sein, die diese implementieren.

+0

Wow. Erstens ist es cool, diesen Aspekt von Standardargumenten zu sehen, aber zweitens macht es mehr Sinn, dass sie es so machen würden, um sich an den Erlang anzupassen. – Camsbury

2

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

Meiner Ansicht nach besteht die Praxis weiterhin, weil Funktionen, die mit mehreren Funktionsköpfen geschrieben werden, um Standardargumente aufzunehmen, das Schreiben intelligenterer Schutzklauseln als die Standardparameter // ermöglichen.

Da Funktionen, die mit mehreren Köpfen definiert sind, in Erlang allgegenwärtig sind (was ein großer Teil des Elixir-Codes in Bezug auf geschrieben wird), erhält eine unverhältnismäßige Menge Code ohne //.

Verwandte Themen