web-dev-qa-db-ja.com

Rustで複数行の文字列を書き込むにはどうすればよいですか?

次のようなものを書くことは可能ですか?

fn main() {
    let my_string: &str = "Testing for new lines \
                           might work like this?";
}
46
sdasdadas

言語参照 を正しく読んでいる場合、それはうまくいくようです。言語リファレンスは、\nなどがサポートされます(一般的なエスケープとして、文字列に改行を挿入するため)。LF、CR、HTを含む「追加のエスケープ」とともに。

39
user1024732

これを行う別の方法は、 raw文字列リテラル を使用することです。

生の文字列リテラルはエスケープを処理しません。それらは、文字U+0072r)で始まり、0個以上の文字U+0023#)およびU+0022(二重引用符)文字が続きます。未加工の文字列本体には任意のUnicode文字のシーケンスを含めることができ、最後のU+0022(二重引用符)文字の前にある同じ数のU+0023(#)文字が後に続く別のU+0022(二重引用符)文字で終了します。

未加工文字列本体に含まれるすべてのUnicode文字はそれ自体を表します。文字U+0022(二重引用符)(その後に少なくとも未加工文字列リテラルの開始に使用されたのと同じ数のU+0023#)文字が続く場合を除く)またはU+005C\)は特別な意味はありません。

文字列リテラルの例:

"foo"; r"foo";                     // foo
"\"foo\""; r#""foo""#;             // "foo"

"foo #\"# bar";
r##"foo #"# bar"##;                // foo #"# bar

"\x52"; "R"; r"R";                 // R
"\\x52"; r"\x52";                  // \x52
35
Moebius

Rustで結果が異なる複数行の文字列を書き込む方法は2つあります。達成しようとしていることに応じて注意してください。

方法1:ぶら下がり空白

"で始まる文字列にリテラルの改行が含まれている場合、Rustコンパイラは、行の最後の空白以外の文字と最初の次の行の空白文字、およびそれらを単一のに置き換えます。

例:

fn test() {
    println!("{}", "hello  
    world");
}

helloの後にリテラル(空白)文字がいくつあっても(0または100)、上記の出力は常にhello worldになります。

方法2:バックスラッシュの改行

これは正反対です。このモードでは、最初の行のリテラル\の前のすべての空白が保持され、next行の後続のすべての空白はまた保存。

例:

fn test() {
    println!("{}", "hello  \
    world");
}

この例では、出力はhello worldです。

さらに、別の回答で述べたように、Rustには「生のリテラル」文字列がありますが、Rustの場合とは異なり、他の言語とは異なり、これのために生の文字列に頼る必要がある)上で見られるように、制限なしに引用されたコンテンツのリテラル改行をサポートします。

2

改行文字と余分なスペースを避けたい場合は、 concat! マクロ。コンパイル時に文字列リテラルを連結します。

let my_string = concat!(
    "Testing for new lines ",
    "might work like this?",
);

assert_eq!(my_string, "Testing for new lines might work like this?");

バックスラッシュ付きの受け入れられた回答 も余分なスペースを削除します。

1
Michael Bausano