여러 줄 문자열 리터럴의 구문은 무엇입니까?


답변:


173

모든 문자열 리터럴은 여러 줄로 나눌 수 있습니다. 예를 들면 다음과 같습니다.

let string = "line one
line two";

와 같은 두 줄 문자열 "line one\nline two"입니다 (물론 \n줄 바꿈 이스케이프도 직접 사용할 수 있습니다 ). 서식상의 이유로 여러 줄에서 문자열을 나누려면 줄 바꿈을 사용하고 공백을 \; 예를 들면 다음과 같습니다.

let string = "one line \
    written over \
    several";

와 동일합니다 "one line written over several".

문자열에 줄 바꿈을 원하면 다음 앞에 줄 바꿈을 추가 할 수 있습니다 \.

let string = "multiple\n\
              lines\n\
              with\n\
              indentation";

그것은 같은 "multiple\nlines\nwith\nindentation";


2
가독성 만 문제라면, concat!()주어진 옵션을 완료하기 위해 매크로를 추가하고 싶습니다 ( doc.rust-lang.org/std/macro.concat.html )
— hakononakani

82

따옴표, 백 슬래시 등을 포함하거나 포함하지 않을 수있는 약간 더 긴 작업을 수행하려는 경우 원시 문자열 리터럴 표기법을 사용하십시오 .

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

    void main() {
        color = v_color;
    };
"#;

문자열 내에 큰 따옴표와 해시 기호가 있으면 임의의 수의 해시를 구분 기호로 표시 할 수 있습니다.

let crazy_raw_string = r###"
    My fingers #"
    can#"#t stop "#"" hitting
    hash##"#
"###;

그러나 ... 결과에 줄 바꿈을 원하지 않으면 줄 바꿈을 피해야하며 원시 문자열이 도움이되지 않습니다.
— poolie

원시 문자열은 줄 바꿈에 신경 쓰지 않거나 (예 : 셰이더 및 커널과 같이 줄 바꿈이 아닌 코드를 삽입 할 때) 모든 줄 끝에 '\'를 추가하지 않아도됩니다. 개행이 실제로 필요할 때. 편집하고 싶을 수도 있고 각 줄의 끝에 '\'로 번거로울 필요가없는 코드를 더 쉽게 포함시킬 수 있습니다. 그게 다야.
— c0g

1
결과 문자열에 줄 바꿈을 원하거나 신경 쓰지 않으면 다른 예제와 같이 큰 따옴표로 묶은 문자열이 완벽하게 잘 작동합니다. 줄 바꿈을 피하려면 원시 문자열이 좋지 않습니다. 텍스트에 따옴표, 백 슬래시 등이 포함 된 경우에만 도움이됩니다. 포함 된 소스에서 발생할 수 있습니다.
— poolie

2
나는 당신이 지금 무엇을 얻고 있는지 당신은 절대적으로 옳습니다.
— c0g

1
이러한 문자열을 인쇄 한 결과를 표시하는 데 도움이됩니다. 대답 자체에서 줄 바꿈으로 어떻게 될지, 들여 쓰기가 어떻게 처리되는지 알 수 없습니다.
— bluenote10

48

Huon의 대답 은 정확하지만 들여 쓰기가 귀찮은 경우 들여 쓰기 된 여러 줄 문자열의 절차 매크로 인 Indoc 을 사용 하는 것이 좋습니다. "들여 쓰기 된 문서"를 나타냅니다. 여러 indoc!()줄 문자열 리터럴을 가져와 들여 쓰기를 해제하여 가장 왼쪽에있는 공백이 아닌 문자가 첫 번째 열에 있는 매크로를 제공합니다 .

let s = indoc! {"
    line one
    line two
"};

결과는 "line one\nline two\n"입니다.

공백은 문서에서 가장 왼쪽에있는 공백이 아닌 문자를 기준으로 유지되므로 다음은 한 줄에 대해 두 줄 들여 쓰기 된 3 개의 공백이 있습니다.

let s = indoc! {"
    line one
       line two
"};

결과는 "line one\n line two\n"입니다.


8

코드에서 여러 줄로 된 텍스트를 들여 쓰려면

let s = "first line\n\
    second line\n\
    third line";

println!("Multiline text goes next:\n{}", s);

결과는 다음과 같습니다.

Multiline text goes next:
first line
second line
third line

이 행동에 중요한 코드를 산문을 사용하여 명시 적으로 언급 하십시오 .
— Shepmaster

현재 이것은 허용 된 답변에 새로운 것을 추가하지 않는 것으로 보입니다 .이 상태 는 \n개행 이스케이프 [...]를 사용할 수 있습니다{backslash} . (댓글에 코드에 백 슬래시를 입력하는 것은 매우 어렵습니다.)
— Shepmaster

2
이 의견은 승인 된 답변에서 두 가지 점을 결합하는 방법을 제안합니다. 코드에서 여러 줄로 작성된 여러 줄 문자열을 생성하는 방법은 있지만 스타일이나 가독성을 위해 동시에 허용됩니다. 이 들여 쓰기가 최종 문자열로 끝나지 않고 코드에서 들여 쓰기. 본문에서는 명확하지 않지만 일반적인 사용 사례이므로 귀중한 제안입니다. (이 상자의 버전은 dtolnay의 답변을 참조하십시오.)
— Dato
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.