我可以转换 Vec<String>
至 Vec<&str>
这样:
let mut items = Vec::<&str>::new();
for item in &another_items {
items.push(item);
}
有更好的选择吗?
最佳答案
有很多方法可以做到这一点,有些有缺点,有些只是对某些人来说更具可读性。
这会将 s
(属于 &String
类型)解引用为 String
“右侧引用”,然后通过Deref
trait 到 str
“右侧引用”,然后变回 &str
。这是在编译器中很常见的东西,因此我认为它是惯用的。
let v2: Vec<&str> = v.iter().map(|s| &**s).collect();
这里 Deref
trait 的 deref
函数被传递给 map
函数。它非常简洁,但需要使用
特征或给出完整路径。
let v3: Vec<&str> = v.iter().map(std::ops::Deref::deref).collect();
这使用强制语法。
let v4: Vec<&str> = v.iter().map(|s| s as &str).collect();
这需要 String
的 RangeFull
切片(只是整个 String
的切片)并引用它。在我看来这很丑陋。
let v5: Vec<&str> = v.iter().map(|s| &s[..]).collect();
这是使用强制将 &String
转换为 &str
。以后也可以用s: &str
表达式代替。
let v6: Vec<&str> = v.iter().map(|s| { let s: &str = s; s }).collect();
以下(感谢 @huon-dbaupp)使用 AsRef
特性,它的存在只是为了从拥有的类型映射到它们各自的借用类型。有两种使用方法,而且任何一种版本的美观程度完全是主观的。
let v7: Vec<&str> = v.iter().map(|s| s.as_ref()).collect();
和
let v8: Vec<&str> = v.iter().map(AsRef::as_ref).collect();
我的底线是使用 v8
解决方案,因为它最明确地表达了您的需求。
关于string - 如何将 Vec<String> 转换为 Vec<&str>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43166122/