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


답변:


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.