关于vector:在Rust中将Vec 转换为&str的一部分?

Convert Vec into a slice of &str in Rust?

根据Steve Klabnik在Rust 1.0之前的文档中关于String&str之间差异的内容,除非您确实需要拥有对String的所有权,否则在Rust中应该使用&str。 同样,除非确实需要对Vec的所有权,否则建议使用对切片(&[])的引用而不是Vec

我有一个Vec,我想编写一个使用此字符串序列的函数,并且不需要对VecString实例拥有所有权,该函数应该使用&[&str]吗? 如果是这样,将Vec引用到&[&str]的最佳方法是什么? 或者,这是强制性的过度杀伤力吗?


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

1
2
3
4
5
6
7
8
9
10
11
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);
}


如果没有内存分配,这实际上是不可能的1。

String&str不仅仅是在不同的角度查看这些位; String&str具有不同的内存布局,因此从一个到另一个需要创建一个新对象。 Vec&[]同样

因此,虽然您可以从Vec< T >进入&[T],从而从Vec进入&[String],但不能直接从Vec进入&[&str]。 您的选择是:

  • 要么接受&[String]
  • 分配引用第一个Vec的新Vec<&str>,并将其转换为&[&str]

作为分配示例:

1
2
3
4
5
6
7
8
9
fn usage(_: &[&str]) {}

fn main() {
    let owned = vec![String::new()];

    let half_owned: Vec<_> = owned.iter().map(String::as_str).collect();

    usage(&half_owned);
}

1不可能进行所需的转换,但是使用@aSpex的答案中所示的泛型和AsRef绑定,您会得到稍微冗长的函数声明,并具有所需的灵活性。