Don*_*owe 22 string reference vector ownership rust
每史蒂夫Klabnik的书面记录上的差异之间的预锈1.0文档中String和&str,拉斯特你应该使用&str,除非你真的需要有一个以上的所有权String.同样,建议使用对slice(&[])的引用而不是Vecs,除非你真的需要对the的所有权Vec.
我有一个Vec<String>和我想写一个使用字符串的这个序列的功能,它并不需要在所有权Vec或String实例,应该说功能拍摄&[&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)
没有内存分配1这实际上是不可能的.
问题是,从去String到&str在不同的光线不仅仅是观看位; String并且&str具有不同的内存布局,因此从一个到另一个需要创建一个新对象.这同样适用于Vec和&[]
因此,虽然你可以去Vec<T>到&[T],因此从Vec<String>到&[String],你不能直接从去Vec<String>到&[&str]:
&[String]Vec<&str>参考第一Vec,并转换是成&[&str]1 所需的转换是不可能的,但是使用泛型和@aSpex的答案中AsRef<str>所示的界限,您会得到一个稍微更详细的函数声明,并具有您所要求的灵活性.