문자열 벡터에 대한 조인 연산자에 해당하는 것은 무엇입니까?


120

Strings 의 벡터를 통해 "join"연산자에 해당하는 Rust를 찾을 수 없었습니다 . 나는 하나가 있고 Vec<String>그들과 함께하고 싶습니다 String:

let string_list = vec!["Foo".to_string(),"Bar".to_string()];
let joined = something::join(string_list,"-");
assert_eq!("Foo-Bar", joined);

관련 :

답변:


153

Rust 1.3.0 이상에서는 다음을 join사용할 수 있습니다.

fn main() {
    let string_list = vec!["Foo".to_string(),"Bar".to_string()];
    let joined = string_list.join("-");
    assert_eq!("Foo-Bar", joined);
}

1.3.0 이전에는이 ​​메서드가 호출되었습니다 connect.

let joined = string_list.connect("-");

표준 라이브러리 prelude 에서 메서드를 자동으로 가져 오기 때문에 아무것도 가져올 필요가 없습니다 .


7
아마도 이것은 변경되었지만 SliceConcatExt야간에만 적용됩니다.

5
@Evert 특성은 불안정한 것으로 표시되지만 그 방법은 안정적이므로 사용할 수 있습니다. use전주곡에 있기 때문에 특성 을 명시 적 으로 지정할 필요가 없습니다 .
interjay


1
@shepmaster 나는 당신의 '회신'제대로하는이 읽을 경우 join에를 itertools.
Steve Powell

2
@shepmaster 감사합니다. 불행히도 다른 답변에 대한 꾸미지 않은 언급은 다소 모호했기 때문에 해당 답변의 어느 부분이 관련이 있는지 전혀 명확하지 않았습니다. 귀하의 의견, 수정 및 답변은 ​​변함없이 우수하지만 귀하의 스타일은 겸손하고 불쾌합니다.
Steve Powell


10

이터레이터를 결합하는 itertools호출 상자 의 함수가 있습니다 join.

extern crate itertools; // 0.7.8

use itertools::free::join;
use std::fmt;

pub struct MyScores {
    scores: Vec<i16>,
}

impl fmt::Display for MyScores {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
        fmt.write_str("MyScores(")?;
        fmt.write_str(&join(&self.scores[..], &","))?;
        fmt.write_str(")")?;
        Ok(())
    }
}

fn main() {
    let my_scores = MyScores {
        scores: vec![12, 23, 34, 45],
    };
    println!("{}", my_scores); // outputs MyScores(12,23,34,45)
}

6
이 코드의 사용자는 단지 그것을 버리기 위해 잠재적으로 큰 문자열을 할당한다는 것을 알고 있어야합니다. 출력에 직접 문자열을 쓰는 것이 더 효율적입니다. Rust에서 공백으로 분리 된 반복자를 인쇄하는 관용적 인 방법무엇입니까? , Rust에서 컨테이너의 각 값 사이에 무언가를 인쇄하는 가장 좋은 방법은 무엇입니까? .
Shepmaster

2
이해할 수 있지만 질문은 join형식화 알고리즘을 최적화하는 방법이 아니라 에 관한 것이 었습니다.
Nick Linker

6
collect+ join더 빠르고 종속성을 추가하지,이 볼 요점 벤치 마크에 대한
murlakatamenka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.