문자열을 어떻게 연결합니까?


199

다음 유형의 조합을 어떻게 연결합니까?

  • strstr
  • Stringstr
  • StringString

14
참고 str하고 &str있는 다른 유형 과 시간의 99 %를, 당신은 단지에 대한 관심을 가져야 &str. 차이점을 자세히 설명하는 다른 질문이 있습니다.
Shepmaster

답변:


235

문자열을 연결할 때 결과를 저장하기 위해 메모리를 할당해야합니다. 시작하는 가장 쉬운 방법은 다음 String&str같습니다.

fn main() {
    let mut owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    owned_string.push_str(borrowed_string);
    println!("{}", owned_string);
}

여기, 우리는 돌연변이 할 수있는 소유 한 문자열을 가지고 있습니다. 메모리 할당을 재사용 할 수 있으므로 효율적입니다. 거기에 비슷한 경우이다 StringString같이, &String 같은 역 참조 할 수있다&str .

fn main() {
    let mut owned_string: String = "hello ".to_owned();
    let another_owned_string: String = "world".to_owned();

    owned_string.push_str(&another_owned_string);
    println!("{}", owned_string);
}

그 후에 another_owned_string는 손대지 않습니다 ( mut예선 자 없음 ). 다른 변형있어 소비String하지만, 변경할 수를 필요로하지 않습니다는. 이것은 왼쪽과 오른쪽 을 취하는 특성구현입니다Add .String&str

fn main() {
    let owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    let new_owned_string = owned_string + borrowed_string;
    println!("{}", new_owned_string);
}

참고 owned_string로 호출 한 후 더 이상 액세스 할 수 없습니다 +.

새로운 줄을 만들고 싶고 둘 다 그대로 두려면 어떻게해야합니까? 가장 간단한 방법은 다음을 사용하는 것입니다 format!.

fn main() {
    let borrowed_string: &str = "hello ";
    let another_borrowed_string: &str = "world";

    let together = format!("{}{}", borrowed_string, another_borrowed_string);
    println!("{}", together);
}

두 입력 변수는 변경할 수 없으므로 터치하지 않습니다. 의 조합에 대해 동일한 작업을 수행하려는 경우 형식을 지정할 수도 String있다는 사실을 사용할 String수 있습니다.

fn main() {
    let owned_string: String = "hello ".to_owned();
    let another_owned_string: String = "world".to_owned();

    let together = format!("{}{}", owned_string, another_owned_string);
    println!("{}", together);
}

당신은하지 않습니다 사용하는 format!것처럼. 한 문자열을 복제 하고 다른 문자열을 새 문자열에 추가 할 수 있습니다 .

fn main() {
    let owned_string: String = "hello ".to_owned();
    let borrowed_string: &str = "world";

    let together = owned_string.clone() + borrowed_string;
    println!("{}", together);
}

참고 -내가 한 모든 유형 사양은 중복입니다. 컴파일러는 여기서 사용되는 모든 유형을 유추 할 수 있습니다. 나는이 질문이 그 그룹에게 인기가 있기를 기대하기 때문에 Rust를 처음 접하는 사람들에게 명확하게 추가했습니다!


2
당신은 Add/ +기호 에 대해 어떻게 생각 하십니까? 원한다면 덮을 수 있습니다.
bluss

어쩌면 그것은 간단하지만 그것을 이해하려면 문자열로 추가에 대한 가능한 유형 서명을 조사해야합니다.
bluss

감사! & String을 & str로 역 참조 할 수있는 방법에 대해 조금 더 깊이 들어가 볼 수 있습니까? 구현의 어느 부분이 그것을 허용하고 /하거나 doco에서 이것을 말합니까?
jsalter

1
@jsalter는 꽤 별개의 주제이므로 다른 최상위 질문으로 유용 할 수 있습니다. 적절한 문서에 링크하도록 업데이트했습니다 (적어도 가능한 한 가깝습니다 ...)
Shepmaster

10
그것은 차이가 있음을 주목해야한다 @ChrisMorgan .to_owned().to_string()IMPL 전문화 위의 코멘트 감사 이후 수정되었습니다. 에 호출 할 때 둘 다 동일한 성능을 갖습니다 &str. 관련 커밋 : github.com/rust-lang/rust/pull/32586/files
차드

49

다른 문자열로 구분하여 여러 문자열을 단일 문자열로 연결하려면 몇 가지 방법이 있습니다.

내가 본 가장 좋은 join방법은 배열 에서 메소드를 사용하는 것입니다.

fn main() {
    let a = "Hello";
    let b = "world";
    let result = [a, b].join("\n");

    print!("{}", result);
}

사용 사례에 따라 더 많은 제어를 선호 할 수도 있습니다.

fn main() {
    let a = "Hello";
    let b = "world";
    let result = format!("{}\n{}", a, b);

    print!("{}", result);
}

내가 본 몇 가지 더 수동적 인 방법이 있으며, 일부는 여기저기서 하나 또는 두 개의 할당을 피합니다. 가독성을 위해 위의 두 가지가 충분하다고 생각합니다.


어디에 join기록되어 있습니까? Array와 String 사이의 중간에있는 것 같습니다. 배열 설명서를 검색하여 빠르게 혼란 스러웠습니다.
Duane J

3
@DuaneJ은 join실제로 부착되어 특징 . 특성은 불안정한 것으로 표시되지만 그 방법은 안정적이며 Prelude에 포함되어 있으므로 기본적으로 모든 곳에서 사용할 수 있습니다. 팀은이 특성이 존재할 필요가 없다는 것을 잘 알고 있으며 앞으로 상황이 바뀔 것이라고 생각합니다. SliceContactExt
Simon Whitehead

9

나는 그 concat방법을 생각하며 +여기에서도 언급해야합니다.

assert_eq!(
  ("My".to_owned() + " " + "string"),
  ["My", " ", "string"].concat()
);

그리고 concat!매크로도 있지만 리터럴에만 있습니다.

let s = concat!("test", 10, 'b', true);
assert_eq!(s, "test10btrue");

+기존 답변 에 이미 언급되어 있습니다. ( 이것은 구현의 Add필요 특성은 String좌측과 같이 &str우측로서 : )
Shepmaster

사실 기존 답변 은 너무 광범위하여 눈치 채지 못했습니다.
suside

6

RUST에서 문자열을 연결하는 간단한 방법

RUST에는 문자열을 연결하는 다양한 방법이 있습니다.

첫 번째 방법 (사용 concat!()) :

fn main() {
    println!("{}", concat!("a", "b"))
}

위 코드의 출력은 다음과 같습니다.

ab


두 번째 방법 (사용 push_str()+연산자) :

fn main() {
    let mut _a = "a".to_string();
    let _b = "b".to_string();
    let _c = "c".to_string();

    _a.push_str(&_b);
    
    println!("{}", _a);
 
    println!("{}", _a + &_b);
}

위 코드의 출력은 다음과 같습니다.

ab

알파벳


세 번째 방법 ( Using format!()) :

fn main() {
    let mut _a = "a".to_string();
    let _b = "b".to_string();
    let _c = format!("{}{}", _a, _b);
    
    println!("{}", _c);
}

위 코드의 출력은 다음과 같습니다.

ab

그것을 확인하고 녹 플레이 그라운드로 실험


이 답변은 기존 답변에 새로운 내용을 추가하지 않습니다.
Shepmaster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.