2010-04-27 5 views
5

In seinem Buch Programmierung in scala (Kapitel 5 Abschnitt 5.9 Pg 93) Odersky diesen Ausdruck erwähnte "bills !*&^%~ code!"Ist Odersky ernst mit "Rechnungen! * & ^% ~ Code!"?

In der Fußnote auf derselben Seite:

„Jetzt sollten Sie in der Lage sein, um herauszufinden, dass dieser Code gegeben, würde die Scala-Compiler

aufrufen (bills.!*&^%~(code)).!()."

das ist für mich ein wenig kryptisch ist, könnte jemand erklären, was hier los ist?

Typ 0
+0

Niemand hat die ", noch. – ziggystar

+1

@ziggystar Die Frage fehlte das Schlusszitat. Es ist nicht Teil des Codes. –

+1

Ich für den einen denke, dass Herr Odersky die verwirrende Vielzahl von Symbolen vermeiden und die Obszönitäten schreiben sollte out in ASCII. Zumindest dest~~POS=HEADCOMP ist es das, was ich tun würde f✻❀king. –

Antwort

9

Was Odersky zu sagen hat, ist, dass es möglich wäre, gültigen Code zu haben, der so aussieht. Zum Beispiel unter der Code:

class BadCode(whose: String, source: String) { 
    def ! = println(whose+", what the hell do you mean by '"+source+"'???") 
} 

class Programmer(who: String) { 
    def !*&^%~(source: String) = new BadCode(who, source) 
} 

val bills = new Programmer("Bill") 
val code = "def !*&^%~(source: String) = new BadCode(who, source)" 
bills !*&^%~ code! 

Nur & kopieren fügen Sie diesen auf der REPL.

+0

@ Daniel vielen Dank für dieses erstaunliche Beispiel. Sie ein scala balck Gürtel Abzeichen verliehen werden sollen. – stacker

+0

@stacker ich habe ein goldenes Abzeichen, sollte es für jetzt genügen. :-) –

2

Ich bin nicht sicher, ob das Buch Methode Signaturen bereitstellt, aber ich nehme an, es auf Scala syntaktischer Zucker nur ein Kommentar ist, so dass es, wenn Sie übernimmt:

bill add monkey 

wo ein Objekt Rechnung ist, das ein Verfahren add hat die einen Parameter dann automatisch interpretiert sie als:

bill.add(monkey) 

ein wenig Scala rostig sein, ich bin mir nicht ganz sicher, wie es Code teilt! in (code).!() bis auf ein vages Kitzeln der grauen Zellen, dass das! Mit operator wird ein Akteur ausgelöst, der in Compiler-Begriffen als implizite.!() -Methode für das Objekt interpretiert werden kann.

+0

+1 für die Erläuterung optional '()', was ist das laut '! * & ^% ~' haben sie einen Sinn? – stacker

3

Der Zeitraum ist optional zum Aufrufen einer Methode, die einen einzelnen Parameter oder eine leere Parameterliste verwendet.

Wenn diese Funktion verwendet wird, wird angenommen, dass der nächste Chunk nach dem Leerzeichen nach dem Methodennamen der einzige Parameter ist. Daher

,

(Rechnungen.! * & ^% ~ (Code)).!().

ist identisch mit

Rechnungen! * & ^% ~ Code!

Das zweite Ausrufezeichen ruft eine Methode für den zurückgegebenen Wert vom ersten Methodenaufruf auf.

+0

+1 für die Erläuterung optional '.' Was ist das laut ‚! * & ^% ~‘ Haben sie keinen Sinn machen – stacker

+0

Stapler:?.! In Scala, können Sie Methoden Namen geben mit (fast), was auch immer Zeichen Sie Dies ist nur eine Methode mit dem Namen '* &^% ~ '. – Jesper

2

Die Kombination der '.()' Ist optional mit Methodenaufrufen (wie Wysawyg oben erklärt) und die Möglichkeit, (fast) beliebige Zeichen für Benennungsmethoden zu verwenden, ermöglicht das Schreiben von Methoden in Scala, die aussehen wie Überlastung des Bedieners. Sie können sogar Ihre eigenen Operatoren erfinden.

Zum Beispiel habe ich ein Programm, das sich mit 3D-Computergrafik befasst. Ich habe meine eigene Klasse Vector zur Darstellung eines 3D-Vektor:

class Vector(val x: Double, val y: Double, val z: Double) { 
    def +(v: Vector) = new Vector(x + v.x, y + v.y, z + v.z) 

    // ...etc. 
} 

Ich habe definiert auch ein Verfahren ** (oben nicht dargestellt) die cross product zweier Vektoren zu berechnen.Es ist sehr praktisch, dass Sie Ihre eigenen Operatoren wie in Scala erstellen können, nicht viele andere Programmiersprachen haben diese Flexibilität.

Verwandte Themen