2014-07-05 31 views
5

Sono uno sviluppatore C# che cerca di imparare F #.Perché la stringa F # non può terminare con virgolette doppie in virgolette?

Per quanto ne so, F # 2.0 ha avuto due tipi di sintassi per le stringhe: stringhe normali e stringhe letterali (like C#). Con la versione F # 3.0 esiste una funzionalità denominata stringhe tra virgolette triplicate.

Per quanto vedo, con questo formato di stringa, ogni cosa tra """ è un letterale stringa letterale. E non c'è bisogno di sfuggire allo escapse sequence characters come doppi apici.

Ad esempio, tutte queste stringhe sono valide;

let a = """ This is a valid "string" """ 
let b = """ This is a valid \string """ 
let c = """ This is a valid 'string """ 

Ma c'è una regola con esso;

Quotes nella stringa tripla citato non possono fine con un doppio virgolette (“), ma possono iniziare con uno.

Quindi questa è una stringa legale;

let s = """"This is a valid string""" 

ma questo non è;

let s = """This is a valid string"""" 

Perché è quello? Ho guardato Strings (F#) on MSDN page, F# 3.0 Language Spec $3.5 Strings and Characters part e More About F# 3.0 Language Features ma non sono riuscito a trovare alcuna informazione sul perché è legale da usare all'inizio della stringa ma non alla fine.

Mi puoi illuminare?

+0

Probabilmente confonderà il lexer/tokenizer. Immagino che ti serva solo uno spazio dopo il primo '' '. – leppie

+0

@Downvoter cura di commentare almeno così posso vedere dove _might_ ha fatto qualcosa di sbagliato? –

risposta

6

La risposta è semplice: la stringa con quotatura tripla termina non appena il compilatore vede tre virgolette. Quindi """a"""" è una stringa che constisting il carattere a, seguito da un ulteriore ", che avvia una nuova stringa.

Se si desidera scrivere codice offuscato, si potrebbe fare qualcosa di simile:

f"""a""""b" 

Per chiamare la funzione f con due archi e "a""b".

+0

_Well_, la tua risposta suona logica a mio avviso. t considerare le ultime tre virgolette invece dei primi tre? Perché all'inizio della stringa, il compilatore considera le prime tre virgolette .Le virgolette dopo questa parte, il compilatore le considerano come parte della stringa. Ad esempio; "" "" "" "a "" "' potrebbe essere una stringa vuota perché ci sono 3 citazioni dopo 3 virgolette. E quando il compilatore vede queste 3 virgolette, potrebbe dire "_Okey, finiamo questa stringa_". Almeno dovrebbe dare un errore in fase di compilazione. Ma è una stringa valida. Questo mi confonde. –

+2

@ SonerGönül: In realtà "" "" "" "a" "" 'fornisce un errore in fase di compilazione. Come previsto, una stringa con quotatura tripla può iniziare con una o due virgolette, ma non con tre. – Tarmil

Problemi correlati