在一个字符串向量上,连接运算符的等价物是什么?

Dav*_*rsa 83 string rust

我无法在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);
Run Code Online (Sandbox Code Playgroud)

Mat*_*ewG 108

在Rust 1.3.0及更高版本中,SliceConcatExt::join可用:

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

在1.3.0之前,您可以使用SliceConcatExt::connect:

let joined = string_list.connect("-");
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要任何导入,因为标准库前缀会自动导入方法.

  • 也许这已经改变了,但是`SliceConcatExt`只是每晚一次. (7认同)
  • @Evert特征标记为不稳定,但其方法是稳定的,因此您可以使用它们.你不需要明确地"使用"这个特性,因为它在前奏中. (5认同)
  • 谢谢@shepmaster。不幸的是,您对另一个答案的未经修饰的引用是很晦涩的,因此根本不清楚该答案的哪一部分是相关的。尽管您的评论,更正和答案总是非常出色,但是您的风格居高临下,令人反感。 (2认同)

Dan*_*gen 22

正如Wilfred所述,SliceConcatExt::connect自版本1.3.0以来已被弃用,赞成SliceConcatExt::join:

let joined = string_list.join("-");
Run Code Online (Sandbox Code Playgroud)


Nic*_*ker 5

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码的用户应注意,它会分配一个可能很大的字符串以将其丢弃。将字符串直接写到输出中效率更高。另请参见[在Rust中打印用空格分隔的迭代器的一种惯用方式是什么?](/sf/ask/2585929601/),[在Rust中,什么是打印在Rust中的每个值之间的最佳方法?一个容器?](/sf/ask/1865114051/)。 (4认同)
  • `collect` +`join`更快并且不添加任何依赖,请参见此[gist](https://gist.github.com/green-s/fbd0d374b290781ac9b3f8ff03e3245d)以获取基准 (3认同)
  • 可以理解,尽管问题是关于“ join”的,但不是如何优化格式化算法的方法,不是吗? (2认同)