Wie kann ich eine JavaScript-for-Schleife in CoffeeScript konvertieren?

73
for (i = 0; i < 10; i++) {

    doStuff();

}

Das ist der JavaScript-Code, den ich in CoffeeScript konvertieren möchte.

Shamoon
quelle
Versuchen js2.coffee auch
PeterM

Antworten:

115
doStuff() for i in [0 .. 9]

Dies wird auf der Einführungsseite erläutert: http://coffeescript.org/#loops

Bearbeiten / Aktualisieren von JP:

Die genaue Übersetzung lautet:

doStuff() for i in [0...10]

Sie müssen mit dem ".." vs "..." vorsichtig sein, zum Beispiel:

count = 0
doStuff() for i in [0..count] #still executes once!

Du denkst also, kein Problem ... Ich werde nur bis Count-1 schleifen!

count = 0
doStuff() for i in [0..count-1] #executes twice!! '0' and then '-1'

Wörtliche Übersetzung von:

for (var i = 0; i < someCount; ++i)
  doStuff()

ist

for i in [0...someCount]
  doStuff()   
jontro
quelle
26
Richtig, oder wörtlich zu übersetzen , for i in [0...10]. Zwei Punkte ( ..) bedeuten "bis zu und einschließlich", während drei Punkte ( ...) "bis zu, aber nicht einschließlich" bedeuten. Es ist ein Rubinismus.
Trevor Burnham
Die Range-Operatoren stammen von Perl, das Ruby stark beeinflusst hat. Ich bin mir nicht sicher, ob Perl sie erfunden oder von einer anderen alten Sprache geerbt hat.
Matyr
@JP Nun, wenn Sie eine Variable in die Schleife einfügen, verhält sich der Code anders. Beispielsweise wird die Laufzeit festgelegt, in welche Richtung der Zähler gehen soll. 0 .. 0 sollte einmal ausgeführt werden. 0 .. -1 sollte zweimal ausgeführt werden.
Jontro
@ Bengt genau. Ich dachte, es sei wichtig, die Antwort so zu ändern, dass Internet-Suchende nicht verwirrt werden. AFAIR, die CoffeeScript-Dokumente sind diesbezüglich nicht klar. Ich habe mich verbrannt, ich will keine anderen. Ich denke, meine zusätzlichen Beispiele machen dies für die Menschen deutlich.
JP Richardson
19

Die markierte Antwort ist funktional korrekt, aber der generierte Code stimmt nicht mit dem ursprünglichen Javascript überein.
Der richtige Weg (lesen Sie den, der dem folgenden Javascript am nächsten kommt)

for (i = 0; i < 10; i++) {
  doStuff();
}

wird doStuff() for i in [0..someCount] by 1 die Notiz von 1 auf dem for - Schleife.

Jetzt erstellt dieser Code noch eine zusätzliche _iVariable. Wenn Sie nicht damit leben können, verwenden Sie Folgendes:

i=0
while i<=someCount
  doStuff()
  i++
Olivier Refalo
quelle
1

Vorherige Antworten funktionieren. Wenn Sie das jedoch fallen lassen i, ist es für mich besser:

for [0...10]
  doStuff()

oder

doStuff() for [0...10]

Die anderen Lösungen fügen eine zusätzliche Iteratorvariable hinzu, die iSie beispielsweise innerhalb der Schleife verwenden können doStuff(i), jedoch unter http://coffeescript.org/v1/#loops :

Wenn Sie den aktuellen Iterationswert nicht benötigen, können Sie ihn weglassen:

browser.closeCurrentTab() for [0...count]

Im Detail ist die Übersetzung von for i in [0...10]ist for (i = j = 0; j < 10; i = ++j), während die Übersetzung von for [0...10]ist for (i = 0; i < 10; i++).

Beachten Sie die Diskussion in anderen Kommentaren über 2-Punkte gegenüber 3-Punkten ( [0..9]vs. [0...10]).

stevo
quelle