gpt4 book ai didi

rust - 无法从 `str`构建 `std::iter::Iterator`类型的集合

转载 作者:行者123 更新时间:2023-12-03 11:24:48 24 4
gpt4 key购买 nike

以下代码无法编译

fn main() {
let n = 10;
let mut s = String::new();
let v = vec!['a'; n];
s += &v.into_iter().collect();
}

与错误:

error[E0277]: a collection of type `str` cannot be built from an iterator over elements of type `char`
--> src/main.rs:5:25
|
5 | s += &v.into_iter().collect();
| ^^^^^^^ a collection of type `str` cannot be built from `std::iter::Iterator<Item=char>`
|
= help: the trait `std::iter::FromIterator<char>` is not implemented for `str`


但是,此修改似乎有效:
fn main() {
let n = 10;
let mut s = String::new();
let v = vec!['a'; n];
let t: String = v.into_iter().collect();
s += &t;
}

我试图了解原因。任何提示/解释都将有所帮助。谢谢。

最佳答案

首先,有效的方法是:

fn main() {
let n = 10;
let mut s = String::new();
let v = vec!['a'; n];
s += &v.into_iter().collect::<String>();
}

其次,让我们探讨一下为什么行得通。您可以在 +=上执行add-assign String,因为它实现了 AddAssign trait:
impl<'_> AddAssign<&'_ str> for String

但前提是右侧是 &str。因此,在您的第一个示例中, rustc尝试将 char的向量收集到 str中。因为 Iterator::collect 的签名,所以它不起作用:
fn collect<B>(self) -> B
where
B: FromIterator<Self::Item>,

指示只能将迭代器收集到实现 FromIterator 的容器中。在所有执行 implement it的类型中,您可以看到 str不是其中一种,但 String是其中之一。那就是您所看到的错误消息。

另一方面,在第二个示例和此答案中的代码中,明确要求 rustc收集到 String中。而且由于 StringDeref作为目标类型实现了 str trait:
impl Deref for String {
type target = str;
}

可以将 &String强制转换为 &str。编译器现在很高兴。

因此,现在您应该能够解释为什么以下看起来有趣的代码也能起作用了:
fn main() {
use std::borrow::Cow;

let n = 10;
let mut s = String::new();
let v = vec!['a'; n];
s += &v.into_iter().collect::<Cow<'_, str>>();
}

关于rust - 无法从 `str`构建 `std::iter::Iterator<Item=char>`类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59590151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com