将Vec <String>转换为Rust中的&str片段?

Don*_*owe 22 string reference vector ownership rust

史蒂夫Klabnik的书面记录上的差异之间的预锈1.0文档中String&str,拉斯特你应该使用&str,除非你真的需要有一个以上的所有权String.同样,建议使用对slice(&[])的引用而不是Vecs,除非你真的需要对the的所有权Vec.

我有一个Vec<String>和我想写一个使用字符串的这个序列的功能,它并不需要在所有权VecString实例,应该说功能拍摄&[&str]?如果是这样,参考Vec<String>进入的最佳方式是&[&str]什么?或者,这种胁迫是否过度杀伤?

aSp*_*pex 26

您可以创建一个既接受&[String]&[&str]使用AsRef特征的函数:

fn test<T: AsRef<str>>(inp: &[T]) {
    for x in inp { print!("{} ", x.as_ref()) }
    println!("");
}

fn main() {
    let vref = vec!["Hello", "world!"];
    let vown = vec!["May the Force".to_owned(), "be with you.".to_owned()];
    test(&vref);
    test(&vown);
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这就是OP正在寻找的答案,因为它允许使用切片而无需不必要的分配。当接受 `AsRef&lt;Path&gt;` 的切片时,这种方法更加有用 - 您希望函数接受所有 `&amp;[&amp;str]`、`&amp;[String]`、`&amp;[Path]` 和 `&amp; [PathBuf]`,无需分配新内存。 (6认同)

Mat*_* M. 8

没有内存分配1这实际上是不可能的.

问题是,从去String&str在不同的光线不仅仅是观看位; String并且&str具有不同的内存布局,因此从一个到另一个需要创建一个新对象.这同样适用于Vec&[]

因此,虽然你可以去Vec<T>&[T],因此从Vec<String>&[String],你不能直接从去Vec<String>&[&str]:

  • 要么接受使用 &[String]
  • 或分配一个新的Vec<&str>参考第一Vec,并转换&[&str]

1 所需的转换是不可能的,但是使用泛型和@aSpex的答案中AsRef<str>所示的界限,您会得到一个稍微更详细的函数声明,并具有您所要求的灵活性.

  • @DonRowe:这会产生额外的分配(O(1),但可能会很昂贵)+转换(O(n))。 (2认同)