Wenn es eine Block- oder lokale Variable gibt, die nicht verwendet werden soll, markieren manche Leute sie mit *
und manchmal mit _
.
Was sind die Unterschiede zwischen ihnen und wann sollte ich welche verwenden? Wenn es nötig ist, mehrere Variablen als unbenutzt zu markieren, wie in den obigen Beispielen, ist entweder besser?
A *
bedeutet "alle restlichen Parameter". Ein _
ist nur ein weiterer Variablenname, obwohl es ein bisschen speziell ist. Sie sind also verschieden, zum Beispiel macht folgendes keinen Sinn:
Wie soll Ruby eigentlich wissen, ob der erste Stern 0, 1 oder 2 der Werte bekommen soll (und umgekehrt)?
Es gibt sehr wenige Fälle, in denen Sie einen Stern verwenden möchten, um Parameter zu ignorieren. Ein Beispiel wäre, wenn Sie nur die letzte einer variablen Anzahl von Parametern verwenden möchten:
%Vor% In Ruby können Sie dem "Rest" der Parameter keinen Namen geben, aber Sie können _
:
Normalerweise ist die Anzahl der Parameter bekannt und Ihre beste Wahl ist die Verwendung von _
:
Beachten Sie, dass Sie auch den letzten Parameter unbenannt lassen können (wie bei *
), obwohl dies weniger offensichtlich ist:
Jetzt _
ist der festgelegte Variablenname, der verwendet werden soll, wenn Sie keinen Wert verwenden möchten. Es ist ein spezieller Variablenname aus zwei Gründen:
Beispiel für Punkt 1:
%Vor%Beispiel für Punkt 2:
%Vor% Schließlich, wie @DigitalRoss bemerkt, speichert _
das letzte Ergebnis in irb
Aktualisieren : In Ruby 2.0 können Sie jede Variable verwenden, die mit _
beginnt, um anzuzeigen, dass sie nicht verwendet wird. Auf diese Weise kann der Variablenname expliziter über das sein, was ignoriert wird:
Ich denke, es ist hauptsächlich stilistisch und die Wahl des Programmierers. Die Verwendung von *
macht für mich in Ruby mehr Sinn, da es den Zweck hat, alle von dieser Position aus übergebenen Parameter zu akkumulieren. _
ist eine Restvariable, die selten in Ruby verwendet wird, und ich habe Kommentare gehört, die sie weglassen muss. Also, wenn ich eines von beiden verwenden sollte, würde ich *
verwenden.
Einige Firmen könnten es in ihrem Programmierstil definieren, wenn sie einen haben, aber ich bezweifle, dass es die meiste Zeit wert ist, weil es eine Wegwerfvariable ist. Ich entwickle mich seit über 20 Jahren professionell und habe noch nie etwas gesehen, was die Benennung eines Wegwerfers definiert.
Persönlich mache ich mir darüber keine Sorgen, und ich wäre mehr mit der Verwendung von Variablen aus einem Buchstaben beschäftigt. Statt dessen würde ich für diesen Zweck unused
oder void
oder blackhole
verwenden.
IMO die Praxis macht Code weniger lesbar und weniger offensichtlich.
Insbesondere in API-Methoden, die Blöcke aufnehmen, ist möglicherweise nicht klar, was der Block tatsächlich erwartet. Dadurch werden Informationen bewusst von der Quelle entfernt, was die Wartung und Modifikation erschwert.
Ich hätte lieber die Variablen entsprechend benannt; in einem kurzen Block wird es offensichtlich sein, dass es nicht benutzt wird. In längeren Blöcken, wenn die Nichtbenutzung bemerkenswert ist, kann ein Kommentar den Grund näher erläutern.
Was sind die Unterschiede zwischen ihnen?
Im Fall _
wird eine lokale Variable _
erstellt. Es ist so, als würde x
verwendet, aber anders benannt.
Im Fall *
wird durch die Zuweisung eines Ausdrucks zu *
[expression]
erstellt. Ich bin mir nicht ganz sicher, wofür es nützlich ist, da es nichts zu tun scheint, was den Ausdruck mit eckigen Klammern umgibt.
Wann sollte ich welche verwenden?
Im zweiten Fall wird kein zusätzliches Symbol erstellt, aber es scheint etwas mehr Arbeit für den Interpreter zu sein. Außerdem ist es offensichtlich, dass Sie dieses Ergebnis niemals verwenden werden, während Sie mit _
die Schleife lesen müssten, um zu wissen, ob sie verwendet wird.
Aber ich sage voraus, dass die Qualität Ihres Codes von anderen Dingen abhängt als von dem Trick, mit dem Sie unbenutzte Blockparameter entfernen. Das *
hat einen gewissen obskuren Cool-Faktor, den ich irgendwie mag.
Hinweis: Beachten Sie beim Experimentieren, dass in% _
der Wert des letzten ausgewerteten Ausdrucks in irb steht.