2012-12-04 11 views
14

Was sind die genauen Unterschiede zwischen Unterstreichungsvariablen und einer benannten Variablen, die mit dem Unterstrich aus der Sicht des Erlang-Compilers beginnt (abgesehen von der Lesbarkeit des Codes)? B. _ und _Var sind unterschiedlichAnonyme Variablen in Erlang

Antwort

20

The do not care Variable _ ein VERY SPECIAL Variable ist, die alles passt und ist NIE auf einen Wert gebunden. Es wird benutzt, wenn ich weiß, dass da etwas ist, aber es ist mir egal, was der Wert ist und ich werde es nie benutzen. Wenn _ nicht gebunden ist, kann es nicht in einem Ausdruck verwendet werden, und der Compiler kennzeichnet es als Fehler.

Variablen wie _Var sind vollkommen normale Variablen, mit denen Sie verglichen werden können und die an Werte gebunden sind, was bedeutet, dass sie in Ausdrücken verwendet werden können.Das Vorfixieren einer Variablen mit _ ist ungefähr Absicht. Der Compiler warnt Sie normalerweise vor einer Variable, die in einem Muster gebunden ist, aber nie benutzt wird, oft ein Zeichen für einen Fehler. Der Compiler warnt jedoch nicht vor Variablen mit dem Präfix _ wie in _Var. Die Absicht ist, dass ich der Variablen einen Namen geben möchte, Dinge benennen ist gut, aber dass ich weiß, dass ich sie nie benutzen werde.

Denken Sie daran, dass _ wirklich die einzige spezielle Variable ist und dass _Var normale Variablen sind und sich wie diese verhalten, wenn sie verwendet werden. Wenn Sie sich pervers fühlen, können Sie alle Ihre Variablen mit _ voranstellen und alles wird noch funktionieren.

+0

Danke! Das war eine durchgehende Antwort :-) – coffeMug

18

Lassen Sie uns Zitat der doc hier:

Die anonyme Variable durch Strich bezeichnet wird (_) und kann verwendet werden, wenn eine Variable erforderlich ist, aber sein Wert ignoriert werden. [...]

Variablen mit Unterstrich beginnen (_), zum Beispiel _Height, sind normale Variablen, nicht anonym: sie vom Compiler im Sinne jedoch ignoriert werden, dass sie alle Warnungen für nicht verwendete Variablen nicht generieren .

Mit anderen Worten, verwenden Sie _Var Form, wenn Sie die gefundene Übereinstimmung müssen angepasst werden - aber nicht wollen, um es weiter zu verwenden und/oder Sie seine Bedeutung zeigen. Und Sie verwenden die Variable _, wenn weder Sie noch der Compiler sich um den Ausdruck kümmern sollen, der von ihm abgeglichen wird.

Beispiel 1:

member(_, []) -> []. 

In dieser Funktion ist nicht ganz klar, was die ersten _ Begegnungen. Aber Umschreiben es direkt, wie folgt aus:

member(Elem, []) -> []. 

... eine Warnung generiert, wenn der Code mit dem Flag warn_unused_vars Set kompiliert wird. Sie können Sie immer noch hier lesbaren Code machen, aber durch unterstrichene Variable:

member(_Elem, []) -> []. 

Beispiel 2:

{_, _, Some} = {1, 2, 3} 

Diese Anpassung Tupel gehen ganz in Ordnung aber, wie die ersten beiden Elemente Tupel werden komplett ignoriert.

{_Var, _Var, Some} = {1, 2, 3} 

wird Diese Anpassung jedoch fehlschlagen: obwohl _Var nicht verwendet werden müssen, sollte es mit dem gleichen Wert ‚gefüllt‘ werden! Da 1 nicht gleich 2 ist, schlägt die Bedingung hier fehl.

+0

OK, aber gibt es einen Grund, diese Art von Variablen nicht zu verwenden, deren Name mit einem Unterstrich beginnt? – coffeMug

+0

@AKh_Sw Da Sie meist _co_ Compiler-Warnung für nicht verwendete Variablen wollen, ist es deshalb vorhanden. –

+1

@AKh_Sw Wie am Ende der Antwort (Beispiel 2) erklärt, kann es badmatch erstellen. Stellen Sie sich vor, Sie haben einen komplexen Code, und nach einem Refactoring entscheiden Sie sich, eine zuvor verwendete Variable zu entfernen, aber diese Variable ist in diesem komplexen Code mehrfach aufgetreten. Sie setzen _ einfach, um es nicht zu benutzen, aber es wird tatsächlich verwendet. Dann könntest du einen unerwarteten Badmatch haben. Darüber hinaus wird die Notwendigkeit, diese Unterstrichvariablen zu verwenden, um den Code zu dokumentieren, manchmal als ein "Code-Geruch" und eine Einladung zur Vereinfachung betrachtet. –