Rust 如何将结构或元组置于迭代程序的状态?

Rust 如何将结构或元组置于迭代程序的状态?,rust,Rust,我对生锈很陌生。我试图用代码的出现作为学习它的借口。我目前是一名长生不老药程序员,所以我整天都在使用map/reduce 我正努力用铁锈做同样的事情。我确信我可以放弃迭代器,用for循环轻松地完成它,但我宁愿不这样做 看起来fold与reduce非常相似,但我不知道如何使用比整数更复杂的状态 input .chars() .map(|c| c.to_digit(10).unwrap()) .fold(initial_state, |state, &x| { let Day1{su

我对生锈很陌生。我试图用代码的出现作为学习它的借口。我目前是一名长生不老药程序员,所以我整天都在使用map/reduce

我正努力用铁锈做同样的事情。我确信我可以放弃迭代器,用
for循环
轻松地完成它,但我宁愿不这样做

看起来
fold
reduce
非常相似,但我不知道如何使用比整数更复杂的状态

input
.chars()
.map(|c| c.to_digit(10).unwrap())
.fold(initial_state, |state, &x| {
    let Day1{sum: sum, prev: prev} = state;
     Some(Day1{
        sum: sum,
        prev: prev,
     });
 })
我收到了很多关于不匹配类型的编译器错误

.fold(initial_state, |state, &x| {
      ^^^^^^^^^^^^^ expected (), found struct `Day1`

let Day1{sum: sum, prev: prev} = state;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected (), found struct `Day1`

为什么它期望
()
,这没什么(我想)。我很想了解错误,但是如果有更好的方法在循环中维护状态,我也希望得到一些帮助。

如果你看看你在做什么,问题就很清楚了。让我解释一下

首先,让生锈的文件保持联系是个好主意。查看那里的方法,您会发现它的特征:

fn fold<B, F>(self, init: B, f: F) -> B where
    F: FnMut(B, Self::Item) -> B,
为此:

let Day1 {sum: sum, prev: prev} = state;
Some(Day1 {
    sum: sum,
    prev: prev,
})
在Rust中(与大多数函数式语言一样),最后一个表达式是返回表达式。在本例中,您没有返回任何内容,但是如果删除分号,您将返回
Some(Day1{sum:sum,prev:prev})
表达式,该表达式的类型为
选项


修复此问题后,您可能会遇到另一个问题:不匹配的
Day1
Option
,这将发生,因为您又有不同的类型:
initial\u state
类型的
Day1
和返回
Option
的折叠函数。解决方案是在这些地方使用相同的类型,例如,使
类型的
选项的
处于初始状态
,或者从fold函数返回
Day1
对象,这样一切都将编译。同样,与Rust文档保持联系会给您带来一个新的解决方案。

请查看如何创建一个新的解决方案。您尚未提供
第1天
输入
初始状态
的定义。FWIW,您只需执行
let Day1{sum,prev}=state
一些(第1天{sum,prev})
类型
第1天
的初始状态
和返回
选项
的折叠函数-您如何知道
初始状态
的类型?OP没有提供它。@Shepmaster只是从错误消息中得到:>^^^^^^^^^^^^^预期(),找到struct
Day1
let Day1 {sum: sum, prev: prev} = state;
Some(Day1 {
    sum: sum,
    prev: prev,
})