ตัวดำเนินการรวมที่เทียบเท่ากับเวกเตอร์ของสตริงคืออะไร?


120

ฉันไม่พบค่าเทียบเท่า Rust สำหรับโอเปอเรเตอร์ "join" บนเวกเตอร์ของ String s ฉันมี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("-");

โปรดทราบว่าคุณไม่จำเป็นต้องนำเข้าอะไรตั้งแต่วิธีการที่จะนำเข้าโดยอัตโนมัติโดยโหมโรงห้องสมุดมาตรฐาน


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.