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


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()   

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++

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]).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.