2016-06-12 23 views
5

Sto giocando nella finestra interattiva f # e ho scoperto che printf non funzionava come mi aspettavo. Nel seguente frammento, la ReadLine eseguito prima del primo printfF #: printf vs Console.WriteLine

let run() = 
    printf "What is your name?" 
    Console.Out.Flush() 
    let value = System.Console.ReadLine() 
    printf "Hello, %s, nice to meet you!" value 

run() 

Se cambio la printf per Console.WriteLine funziona come previsto.

let run() = 
    Console.Out.WriteLine "What is your name?" 
    Console.Out.Flush() 
    let value = System.Console.ReadLine() 
    printf "Hello, %s, nice to meet you!" value 

run() 

Che cosa sta succedendo con printf? C'è una chiamata flush Posso farla stampare prima della lettura? C'è una f # readline che dovrei usare?

----------------- [Edit] --------------------

Dopo aver letto La risposta di Fyodor Soikin, ho provato a verificare quanto segue. Abbastanza sicuro, ciò che è stato stampato sullo schermo è stato Hello e dopo aver inserito un input, ha stampato World.

open System 
let run() = 
    printf "Hello\n World" 
    let value = System.Console.ReadLine() 
    let msg = sprintf "Hello, %s, nice to meet you!" value 
    printf "%s" msg 
run() 
+3

'WriteLine' è equivalente a' printfn', non 'printf'. Forse la tua console non esegue il rendering del testo fino a quando non viene ricevuta una nuova riga? –

+1

Infatti, @FyodorSoikin è corretto: se si cambia 'printf' in' printfn', la funzione 'run' funziona come ci si aspetterebbe. In ogni caso, è possibile fare a meno della funzione 'ignore' e non è necessario svuotare la console. –

+1

Sì. Ho confermato anche questo. Ho anche confermato che è coerente con 'Console.Write' vs' Console.Writeline'. Questo solleva solo la domanda, perché 'Console.Write' non scrive sull'output come previsto? Ho persino lavato il buffer. –

risposta

7

printf è equivalente a Console.Write, e printfn è equivalente a Console.WriteLine. Stai confrontando le funzioni che non sono equivalenti.

Basta sostituire il printf con printfn e l'esempio funzionerà come previsto.


Perché non lavorare con printf e Console.Write
Questo è semplicemente il modo in cui le funzioni di FSI: non stampa il testo nella finestra di output fino a quando il programma produce un ritorno a capo. C'è una buona motivazione per questo: se FSI ha stampato il testo subito, potrebbe interrompere il tuo output con la sua uscita di alcune informazioni intermedie.

Chiamare Console.Flush non ha nulla a che fare con questo. Quando il tuo programma viene eseguito in FSI, in realtà non hai accesso diretto alla console, passa attraverso il filtro di FSI. FSI riceve subito il tuo input (non è necessario chiamare lo Flush), ma non lo stampa subito (vedi sopra).

Se si esegue il programma da solo, non in FSI, l'output verrà reso come previsto.