Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在scan()迭代器中检索状态?_Rust_Iterator - Fatal编程技术网

Rust 在scan()迭代器中检索状态?

Rust 在scan()迭代器中检索状态?,rust,iterator,Rust,Iterator,要获得整数序列的部分和,我可以在迭代器上使用scan(),如下所示: let partial: Box<[u32]> = list .iter() .scan(0, |st, elem| { let ret = *st; *st += elem; Some(ret) }) .collect(); let partial:Box= 列表 .国际热核实验堆(iter) .scan(0,| st,el

要获得整数序列的部分和,我可以在迭代器上使用
scan()
,如下所示:

let partial: Box<[u32]> =
    list
    .iter()
    .scan(0, |st, elem| {
        let ret = *st;
        *st += elem;
        Some(ret)
    })
    .collect();
let partial:Box=
列表
.国际热核实验堆(iter)
.scan(0,| st,elem |{
设ret=*st;
*st+=元素;
一些(ret)
})
.收集();
上面的代码运行得很好,但我正在尝试修改它,以获得总的总和

比如:

let (partial, total): (Box<[u32]>, u32) =
    list
    .iter()
    .scan(0, |st, elem| {
        // TODO
    })
    .collect();
let(部分,总计):(框,u32)=
列表
.国际热核实验堆(iter)
.scan(0,| st,elem |{
//待办事项
})
.收集();
似乎我只需要获得
st
的最终值,迭代器应该已经知道它的值。但是,除了在整个序列上进行第二次迭代(例如使用
fold()
),我似乎找不到检索该值的方法


有没有一种方法可以在一次传递中找到部分和和和的总和?

您必须决定在闭包中要做什么

正如代码中所示,您还记得
ret=*st
,这是加法发生之前累加器的值,然后返回
Some(ret)
。因此,您在结果中得到的第一项当前是
0


如果要在求和后返回值,只需返回
Some(*st)
,这是加法后更新的累加器值。

您必须决定要在闭包中执行什么操作

正如代码中所示,您还记得
ret=*st
,这是加法发生之前累加器的值,然后返回
Some(ret)
。因此,您在结果中得到的第一项当前是
0


如果您想要求和后的值,您应该只返回
Some(*st)
,这是加法后更新的累加器值。

扫描中包括总和,但然后分割最后一个值

use std::iter;

fn main() {
    let list = vec![1, 2, 3, 4];

    // Add zero at the start to emulate what you had before
    let partial: Box<[u32]> = iter::once(0)
        .chain(list.iter().scan(0, |st, elem| {
            *st += elem;
            Some(*st)
        }))
        .collect();
    // unwrap since with the added zero, the slice will always be non-empty
    let (total, partial) = partial.split_last().unwrap();

    println!("partial sums: {:?}", partial);
    println!("total sum: {}", total);
}

扫描中包括总和,但随后将最后一个值拆分

use std::iter;

fn main() {
    let list = vec![1, 2, 3, 4];

    // Add zero at the start to emulate what you had before
    let partial: Box<[u32]> = iter::once(0)
        .chain(list.iter().scan(0, |st, elem| {
            *st += elem;
            Some(*st)
        }))
        .collect();
    // unwrap since with the added zero, the slice will always be non-empty
    let (total, partial) = partial.split_last().unwrap();

    println!("partial sums: {:?}", partial);
    println!("total sum: {}", total);
}

您的第一个代码段的开头是零,而忽略列表的最后一个元素,这是有意的吗?(即对于
list=[1,2,3,4]
,输出是
[0,1,3,6]
,忽略
4
@SCappella是的,这是有意的。我正在编写一个编译器,部分和用于测量结构中每个元素的偏移量(忽略对齐问题)。然后,总和将是结构的大小。是否有意让第一个代码段的开头为零,而忽略列表的最后一个元素?(即对于
list=[1,2,3,4]
,输出为
[0,1,3,6]
,忽略
4
@SCappella是的,这是故意的。我正在编写一个编译器,部分和用于测量结构中每个元素的偏移量(忽略对齐问题)。总的总和就是结构的大小。这可能是本例中最好的答案,但我最终编写了一个新的迭代器trait
scan_ref()
通过引用而不是值获取第一个参数,感觉更干净。这可能是本例中的最佳答案,但我最终编写了一个新的迭代器trait
scan_ref()
通过引用而不是值获取第一个参数,感觉更干净。