2016-10-17 1 views
5

Ich arbeite mit coffeescript (Version 1.11.1) und stieß auf etwas, das ich nicht beschreiben kann. Ich habe einfach nur versucht, ein Array von Objekten von einem Feld zu sortieren, die ich wie so tun können:Coffeescript array.sort (a, b) generiert fehlerhaftes JS

data.sort (a,b) -> 
    if a.name < b.name then -1 else if a.name > b.name then 1 else 0 

Dies erzeugt das folgende Javascript:

data.sort(function(a, b) { 
    if (a.name < b.name) { 
    return -1; 
    } else if (a.name > b.name) { 
    return 1; 
    } else { 
    return 0; 
    } 
}); 

ehrfürchtig. Aber in meinem ersten Versuch habe ich diese statt:

data.sort(a,b) -> 
    if a.name < b.name then -1 else if a.name > b.name then 1 else 0 

Und das erzeugte Javascript ist für das heißt:

data.sort(a, b)(function() { 
    if (a.name < b.name) { 
    return -1; 
    } else if (a.name > b.name) { 
    return 1; 
    } else { 
    return 0; 
    } 
}); 

Welche, weil Javascript so nützlich ist, nicht stumm (zumindest in Chrome) und bewirkt, dass die Umgebungsfunktion vorzeitig zurückkehrt. Ein wenig frustrierend, aber ich werde darüber hinwegkommen.

Zuerst möchte ich bestätigen, dass das Verhalten erwartet wird. Ich denke es ist wahrscheinlich und ich habe ein paar vage Gedanken um meinen Schädel herum, warum das so ist, aber ich hoffte, ein festeres Verständnis zu bekommen. Wie soll dies beschrieben werden oder welche Terminologie ist für dieses Merkmal der Sprache relevant?

+0

Ich würde das Niveau der Weißraumempfindlichkeit beunruhigend finden, wenn es kein Fehler ist * (und wenn ich CoffeeScript verwendete) *. –

+0

@squint Je mehr ich darüber nachdenke, der Grund, warum ich denke, dass dies geschieht, ist, dass eine Funktion eine Funktion in js zurückgeben kann, also muss es eine Möglichkeit geben, die beiden zu unterscheiden.Coffeescript hat syntaktisch sinnvolle Leerzeichen wie (ala Python) also kommt das mit dem Deal. Wirklich ist es die JS-Maschine, die hier das Problem ist. Warum es nicht abmeldet, dass a/b nicht definiert ist, ist für mich unergründlich. – JimmyJames

+0

Die JS-Engine ist nicht das Problem. JS-Engines werden Ihnen sagen, dass 'a' oder' b' nicht deklariert sind, wenn sie es nicht sind. Wenn kein * ReferenceError * vorhanden ist, werden diese Bezeichner deklariert. Ich bin kein Python-Entwickler, aber ich weiß, dass es für die Einrückung empfindlich ist. Ich habe nicht bemerkt, dass die Empfindlichkeit des Weißraums sich auf das Niveau ausgeweitet hat, das Sie hier zeigen. –

Antwort

4

Das ist das erwartete Verhalten.


Coffee unterstützt alle folgenden:

  • (a, b) -> 5 Notation für Funktionen,

  • -> 5 Notation für Funktionen ohne Argumente,

  • f(a, b) Notation für Funktion aufruft und

  • f a Notation für Funktion aufruft (implizite Klammern).

Wie nennt man das Ergebnis einer Funktionsaufruf f(a, b) mit einem Funktionsparameter -> 5?

Die Antwort ist-

f(a, b) -> 5 

-die wie Sie vielleicht bemerkt haben, sieht ziemlich ähnlich to-

f (a, b) -> 5 

-die f dem Aufruf übersetzt, vorbei an der Funktion (a, b) -> 5 als Parameter.

+0

Vielen Dank für die Bestätigung, dass dies erwartet wird, aber die wirkliche Frage ist, wie man die Eigenschaft beschreibt, das Zeug, das nach dem Raum kommt, zu einem Parameter zu machen? Oder eine Verknüpfung zu der relevanten Beschreibung, wie diese Syntax interpretiert wird. – JimmyJames

+0

Eine Beschreibung der [Funktions-Literal-Syntax ist hier] (http://coffeescript.org/#literals). Ich habe von diesem Feature gehört, das als "implizite Klammern" bezeichnet wird. Die Implementierung liest man am besten als [annotierte Quelle für die Sprachgrammatik] (http://coffeescript.org/documentation/docs/grammar.html). [Das Funktionsliteral ist hier definiert] (http://coffeescript.org/documentation/docs/grammar.html#section-24). – Anko

+1

@JimmyJames Ich würde sagen "(weiß) Raum als Funktion Anwendung Operator" – Bergi

Verwandte Themen