rust - 是否可以将 `Borrow<T>` 转换为 `AsRef<T>` 或反之亦然?

标签 rust

我有一个变量 tokens: &[AsRef<str>]我想将它连接成单个字符串:

// tokens: &[AsRef<str>]
let text = tokens.join("") // Error
let text = tokens.iter().map(|x|x.as_ref()).collect::<Vec<_>>().join("") // Ok, but...
第二个是笨拙且低效的,因为它将项目重新分配给一个新的Vec。 .
根据the source code , join可申请tokens如果它的类型是 &[Borrow<str>] :
// if tokens: &[Borrow<str>]
let text = tokens.join("") // OK

// so I want to convert &[AsRef<str>] to &[Borrow<str>]
let text = convert_to_borrow(tokens).join("")
我该怎么做?为什么是 Join为实现 Borrow 的类型实现但不是 AsRef ?

最佳答案

它可能会稍微慢一些,但你可以collect &str 的迭代器s 直接变成 String .

let text: String = tokens.iter().map(|s| s.as_ref()).collect();
这是可能的,因为 String implements FromIterator<&'_ str> .这种方法增加了 String通过反复调用push_str ,这可能意味着它必须重新分配多次,但它不会创建中间 Vec<&str> .根据所使用的切片和字符串的大小,这可能会更慢(尽管在某些情况下也可能会稍微快一些)。如果差异对您来说很重要,您应该对两个版本进行基准测试。
没有办法处理T: AsRef<str>的切片就好像它是 T: Borrow<str> 的一部分因为不是所有实现AsRef的东西实现 Borrow ,所以在通用代码中编译器无法知道 Borrow实现申请。

关于rust - 是否可以将 `Borrow<T>` 转换为 `AsRef<T>` 或反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63246747/

相关文章:

rust - `impl Trait`不允许在函数和固有方法返回类型之外

rust - 如何将切片与字节字符串文字进行比较?

arrays - 这是从 SIMD 数组转换为常规数字类型的未定义行为吗?

rust - 为什么我在 Rust 中取出数组的一部分后不能打印它?

rust - 如何将 Vec<T> 转换为 C 语言友好的 *mut T?

rust - 如何使用 axum 和 rust-embed 托管 SPA 文件并嵌入

multithreading - Rust中的多线程备忘录

rust - 当某些项目需要替换时,实现 `IntoIterator` 的惯用方法是什么?

使用 clone_from_slice() 而不是 copy_from_slice() 的性能损失?