string - 如何将 Vec<String> 转换为 Vec<&str>?

标签 string vector rust type-conversion

我可以转换 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();

这需要 StringRangeFull 切片(只是整个 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/

相关文章:

java - 即使字符串包含子字符串,字符串也包含方法返回 false

swift - 如何在 Swift 3 中将两个字符串(日期和时间)组合成一个新日期

tcp - 你如何阅读 &mut [0; 的内容? 128]?

rust - 如何将红 bean 杉组件分离到不同的文件中?

macros - 是否可以使用 "namespace"Rust 宏?

c - 如何添加字符串中存在的数字?

c++ - 使用 vector 对字母数字字符串进行排序

c++ - 在整个范围内使用 vector::erase

c++ - Rcpp 中的折叠 vector

c - 如何在C中打印出字符串的单个字符