字符串向量上的join运算符等效于什么?


Answers:


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如果我正确阅读了您的“答复”,则有一个joinin itertools
史蒂夫·鲍威尔

2
谢谢@shepmaster。不幸的是,您对另一个答案的未经修饰的引用是很晦涩的,因此根本不清楚该答案的哪一部分是相关的。尽管您的评论,更正和答案总是非常出色,但是您的风格居高临下,令人反感。
史蒂夫·鲍威尔


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中打印用空格分隔的迭代器的惯用方式是什么?在防锈,什么是打印在每个值之间的东西在一个容器中的最佳方式?
Shepmaster

2
可以理解,尽管问题是关于join,而不是如何优化格式化算法的方法,不是吗?
尼克·林格

6
collect+ join速度更快,并且不添加任何依赖项,请参见该要点以获得基准测试
murlakatamenka,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.