2014-07-05 9 views
5

Ich bin ein C# -Entwickler, der versucht, F # zu lernen.Warum F # string kann nicht mit Doppelzitat in der Dreifach-Anführungszeichen enden?

Soweit ich weiß, F # 2.0 hatte zwei Arten von Syntaxen für Strings: normale Strings und wörtlich Strings (like C#). Bei der F # 3.0-Version gibt es eine Funktion namens mit dreifach-zitierten Strings.

Soweit ich sehe, ist mit diesem String-Format, alles zwischen """ ein wörtliches String-Literal. Und es gibt keine Notwendigkeit, escapse sequence characters wie doppelte Anführungszeichen zu entkommen.

Zum Beispiel alle diese sind gültige Zeichenfolgen;

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

Aber es gibt eine Regel mit ihm;

Zitate in dem Triple-String in Anführungszeichen nicht Ende mit einem doppelten Anführungszeichen („), aber es können mit einer beginnen.

Also dies ist eine legale Zeichenfolge;

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

aber das ist nicht;

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

Warum ist das? Ich schaute auf Strings (F#) on MSDN page, F# 3.0 Language Spec $3.5 Strings and Characters part und More About F# 3.0 Language Features, aber ich konnte keine Informationen darüber finden, warum es legal ist, am Anfang von String zu verwenden, aber nicht am Ende.

Können Sie mich aufklären?

+0

Wahrscheinlich wird der Lexer/Tokenizer verwirren. Ich denke du brauchst nur ein Leerzeichen nach dem ersten '' '. – leppie

+0

@Downvoter Vorsicht, zumindest zu kommentieren, damit ich sehen kann, wo _might_ etwas falsch gemacht hat? –

Antwort

6

Die Antwort ist einfach: Der String mit drei Anführungszeichen endet, sobald der Compiler drei Anführungszeichen sieht. So ist """a"""" ein String bestehend aus dem Zeichen a, gefolgt von einem zusätzlichen ", der eine neue Zeichenfolge beginnt.

Wenn Sie verschleierten Code schreiben möchten, können tun Sie so etwas wie:

f"""a""""b" 

die Funktion f mit zwei String-"a" und "b" zu nennen.

+0

_Well_, klingt Ihre Antwort logisch meiner Meinung nach. Upvoted. Aber warum Compiler doesn ' t Betrachten wir die letzten drei Anführungszeichen anstelle der ersten drei? Weil der Compiler am Anfang der Zeichenkette die ersten drei Anführungszeichen betrachtet, die die Quotes nach diesem Teil als Teil der Zeichenkette betrachten, zum Beispiel: '" "" "" "a "" "" könnte eine leere Zeichenfolge sein, da 3 Anführungszeichen nach 3 Anführungszeichen vorhanden sind. Und wenn der Compiler diese 3 Zitate sieht, könnte er sagen "_Okey, lass uns diese Zeichenfolge beenden_". Zumindest sollte es Kompilierzeit Fehler geben. Aber es ist eine gültige Zeichenfolge. Das verwirrt mich. –

+2

@ SonerGönül: Eigentlich "" "" "" "a" "" 'gibt einen Kompilierzeitfehler. Wie Sie richtig erwartet haben, kann ein String mit drei Anführungszeichen mit einem oder zwei Anführungszeichen beginnen, aber nicht mit drei. – Tarmil

Verwandte Themen