Điều gì tương đương với toán tử nối trên một vectơ của chuỗi?


120

Tôi không thể tìm thấy Rust tương đương cho toán tử "tham gia" trên một vectơ Strings. Tôi có một Vec<String>và tôi muốn tham gia với họ như một người duy nhất String:

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

Có liên quan:

Câu trả lời:


153

Trong Rust 1.3.0 trở lên, joincó sẵn:

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

Trước 1.3.0, phương thức này được gọi là connect:

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

Lưu ý rằng bạn không cần nhập bất kỳ thứ gì vì các phương thức được nhập tự động bởi prelude thư viện chuẩn .


7
Có lẽ điều này đã thay đổi, nhưng chỉ SliceConcatExtlà hàng đêm.

5
@Evert Đặc điểm được đánh dấu là không ổn định, nhưng các phương pháp của nó ổn định nên bạn có thể sử dụng chúng. Bạn không cần phải nói rõ useđặc điểm vì nó đang ở khúc dạo đầu.
giữa


1
@shepmaster Nếu tôi đọc 'trả lời' của bạn một cách chính xác, có một jointrong itertools.
Steve Powell

2
Cảm ơn bạn @shepmaster. Thật không may, tham chiếu không được trang trí của bạn cho một câu trả lời khác khá khó hiểu, vì vậy hoàn toàn không rõ ràng phần nào của câu trả lời đó có liên quan. Mặc dù nhận xét, sửa chữa và câu trả lời của bạn luôn luôn xuất sắc nhưng phong cách của bạn là trịch thượng và phiến diện.
Steve Powell


10

Có một hàm từ itertoolsthùng cũng được gọi là hàm jointham gia trình vòng lặp:

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
Người dùng mã này nên biết rằng nó phân bổ một chuỗi lớn tiềm năng chỉ để vứt nó đi. Sẽ hiệu quả hơn khi ghi các chuỗi trực tiếp vào đầu ra. Xem thêm Cách thành ngữ để in một trình lặp được phân tách bằng dấu cách trong Rust là gì? , Trong Rust, cách tốt nhất để in thứ gì đó giữa mỗi giá trị trong một vùng chứa là gì? .
Shepmaster

2
Có thể hiểu được, mặc dù câu hỏi là về joinchứ không phải về cách tối ưu hóa thuật toán định dạng, phải không?
Nick Linker

6
collect+ joinnhanh hơn và không thêm phụ thuộc, hãy xem ý chính này để biết điểm chuẩn
murlakatamenka 23/09/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.