gpt4 book ai didi

iterator - 使用修改后的 `Chars` 迭代器时生命周期参数的数量错误

转载 作者:行者123 更新时间:2023-11-29 07:50:55 25 4
gpt4 key购买 nike

我想为包含 String 的结构实现 IntoIterator 特性。迭代器基于 chars() 迭代器,应该计算 '1' 字符并累加结果。这是我目前得到的简化版本:

use std::iter::Map;
use std::str::Chars;

fn main() {
let str_struct = StringStruct { system_string: String::from("1101") };
for a in str_struct {
println!("{}", a);
}
}

struct StringStruct {
system_string: String
}

impl IntoIterator for StringStruct {
type Item = u32;
type IntoIter = Map<Chars, Fn(char) -> u32>;

fn into_iter(self) -> Self::IntoIter {
let count = 0;
return self.system_string.chars().map(|c| match c {
Some('1') => {
count += 1;
return Some(count);
},
Some(chr) => return Some(count),
None => return None
});
}
}

预期输出:1, 2, 2, 3

这失败了:

error[E0107]: wrong number of lifetime parameters: expected 1, found 0
--> src/main.rs:17:25
|
17 | type IntoIter = Map<Chars, Fn(char) -> u32>;
| ^^^^^ expected 1 lifetime parameter

chars 迭代器应该与 StringStruct::system_string 具有相同的生命周期,但我不知道如何表达这一点,也不知道这种方法是否可行。

最佳答案

要回答您提出的问题,我建议您impl IntoIterator for &StringStruct (引用 StringStruct 而不是直接结构)。代码如下所示:

impl<'a> IntoIterator for &'a StringStruct {
type Item = u32;
type IntoIter = Map<Chars<'a>, Fn(char) -> u32>;
// ...
}

但是,之后您会注意到许多更多错误,它们的来源不同。弹出的下一个错误是 Fn(char) -> u32在编译时没有固定大小。

问题是您尝试通过编写 Fn(char) -> u32 来命名您的闭包类型.但这不是您的闭包类型,而仅仅是闭包实现的特征。闭包的类型无法命名(有时称为“Voldemort 类型”)。

这意味着,现在您无法指定 Map<_, _> 的类型目的。这是一个已知的问题;最近接受的impl Trait -RFC 可能会为这种情况提供解决方法。但现在,这是不可能的,抱歉。

那么如何解决呢?您需要创建自己的类型来实现 Iterator并使用它代替 Map<_, _> .请注意,您仍然可以使用 Chars迭代器。这是完整的解决方案:

struct StringStructIter<'a> {
chars: Chars<'a>,
count: u32,
}

impl<'a> Iterator for StringStructIter<'a> {
type Item = u32;

fn next(&mut self) -> Option<Self::Item> {
self.chars.next().map(|c| {
if c == '1' {
self.count += 1;
}
self.count
})
}
}

impl<'a> IntoIterator for &'a StringStruct {
type Item = u32;
type IntoIter = StringStructIter<'a>;

fn into_iter(self) -> Self::IntoIter {
StringStructIter {
chars: self.system_string.chars(),
count: 0,
}
}
}

fn main() {
let str_struct = StringStruct { system_string: String::from("1101") };
for a in &str_struct {
println!("{}", a);
}
}

还有一个小注释:一个明确的 return不必要的时候在 Rust 中被认为是糟糕的风格。通过删除 return 更好地坚持规则并编写惯用代码只要有可能 ;-)

关于iterator - 使用修改后的 `Chars` 迭代器时生命周期参数的数量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40057904/

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