我有一个变量 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/