2016-04-13 10 views
1

Ich folge diesen tutorial die mir diesen Code zu geben:Fehler bei dem Code ceylon Tutorial läuft

"Run the module `hello.ceylon`." 
shared void run() { 
    process.write("Enter a number (x): "); 
    value userX = process.readLine(); 
    value x = parseFloat(userX); 
    process.write("Enter a number (y): "); 
    value userY = process.readLine(); 
    value y = parseFloat(userY); 

    if (exists x, exists y) { 
     print("``x`` * ``y`` = ``x * y``"); 
    } else { 
     print("You must enter numbers!"); 
    } 
} 

Aber es gibt mir diese Meldung:

Argument muss übertragbar Zeichenfolge von parseFloat den Parameter : Schnur? ist nicht zu String

zuweisbar Ich habe diesen Code kopieren und einfügen, aber immer noch die gleiche Nachricht.

Antwort

1

process.readLine() liefert ein String?, das heißt, ein String wenn es eine Linie oder null wenn nicht (beispielsweise Ende stream) lesen kann. parseFloat erfordert eine nicht optionale String: parseFloat(null) ist nicht zulässig. So Sie assert haben, dass userX existiert:

assert (exists userX = process.readLine()); 

oder

value userX = process.readLine(); 
assert (exists userX); 

Beide Formen userX eine nicht optionale Variable machen.

3

Ich bin der Autor des Tutorials.

Es tut mir schrecklich leid, dass dieser Beispielcode nicht mehr funktioniert (es funktionierte mit Ceylon 1.0.0, siehe unten).

Ich habe es in der Anleitung behoben und eine runnable sample in der Ceylon Web IDE erstellt, die Sie verwenden können, um dies auszuprobieren.

Grundsätzlich ist das Problem, dass, wie Lucas Werckmeister- wies darauf hin, readLine() ein String? zurück, die zu String|Null äquivalent ist, weil es nicht möglich sein kann, etwas von dem Eingang (Benutzer-Tastatur), in dem Fall, dass Sie null zurück zu lesen .

Das Codebeispiel arbeitete mit Ceylon 1.0.0, da readLine() verwendet wurde, um eine String zurückzugeben.

Also für den Code zu kompilieren, müssen Sie sicherstellen zu überprüfen, dass das, was hast du zurück exists (dh null nicht.):

value userX = process.readLine(); 
value x = parseFloat(userX else ""); 

Wenn Sie userX else "" tun, Sie Ceylon sagen, dass, wenn userX existiert, sollte es das verwenden, wenn nicht, stattdessen "" verwenden. Auf diese Weise erhalten wir immer ein String zurück ...

Der gesamte Code-Snippet sollte wie folgt aussehen (siehe oben verknüpften Probe):

process.write("Enter a number (x): "); 
value userX = process.readLine(); 
value x = parseFloat(userX else ""); 
process.write("Enter a number (y): "); 
value userY = process.readLine(); 
value y = parseFloat(userY else ""); 

if (exists x, exists y) { 
    print("``x`` * ``y`` = ``x * y``"); 
} else { 
    print("You must enter numbers!"); 
} 

Vielen Dank für den Hinweis auf den Fehler! Ich hoffe, Sie genießen den Rest des Tutorials.