Rust 如何将reduce应用于块(来自对数组的借用引用)?

Rust 如何将reduce应用于块(来自对数组的借用引用)?,rust,Rust,我如何使用功能模式而不引起借用问题?编译器提出的解决方案会导致另一个错误(预期数组[u8;3],找到“&[u8]”),并且会无限期地从一个错误切换到另一个不同的错误。 对于这样一个简单的任务,一些相关的代码似乎过于复杂 我能写的最好的可编译代码就是这个复杂的代码,我完全放弃了: 请注意,三明治只是一个例子来说明这个问题(实际上它并没有什么作用)。我期望一个更复杂的外部函数,而不是lambda。您必须以某种方式将值的所有权转换为所需的[u8;3] 可能与使用迭代器\u fold\u self功能的

我如何使用功能模式而不引起借用问题?编译器提出的解决方案会导致另一个错误(
预期数组
[u8;3]
,找到“&[u8]”
),并且会无限期地从一个错误切换到另一个不同的错误。 对于这样一个简单的任务,一些相关的代码似乎过于复杂

我能写的最好的可编译代码就是这个复杂的代码,我完全放弃了:


请注意,三明治只是一个例子来说明这个问题(实际上它并没有什么作用)。我期望一个更复杂的外部函数,而不是lambda。

您必须以某种方式将值的所有权转换为所需的
[u8;3]

可能与使用
迭代器\u fold\u self
功能的本例相同(根据今天晚间):

#![特征(迭代器折叠自身)]
///取一个表示3元组序列的数组,并通过任意三明治逻辑将其缩减。
fn三明治(第一层:&[u8])->[u8;3]{
一、组块(3)
.map(|x |[x[0],x[1],x[2]]))
.reduce(|x,y |[x[0],y[1],x[0]))
.unwrap()
}
fn main(){
设test_set=[1,2,3,1,2,3];
println!(“{:?}”,三明治(&test_set));
}

您可以使用
try_into
(从此)获取一个拥有的切片:

fn三明治(lst:&[u8])->[u8;3]{
一、组块(3)
.map(|x |->[u8;3]{x.try_into().unwrap()})
.reduce(|x,y |[x[0],y[1],x[0]))
.unwrap()
}

什么是
reduce
?从标准库或itertools板条箱中我无法识别它。@kmdreko我编辑以添加引用。“
reduce
为迭代器提供了一个类似于fold但没有初始值的reduce函数。”
reduce
希望闭包的参数及其返回值都具有相同的类型。但是
chunks
返回切片,
sandwich
返回一个数组,因此您需要在某个时刻进行转换。可能:
lst.chunks(3).cloned().reduce(|x,y |[x[0],y[1],x[0]])
,这样就行了。然而,当区块大小很大时,比如说200,我如何取得所有权?@olyk,因为您可以映射另一个函数,将引用片段的内容复制到另一个拥有的片段中。你也可以找到这样做的方法:)@olyk,检查更新的答案:“->[u8;3]”部分对我来说很新奇,基本上解决了我所有的问题。也许我需要读完这本书的每一段,然后才能有效地编写任何真实的程序。。。。在性能方面值得一试。
use reduce::Reduce;

/// Take an array representing a sequence of 3-tuples and fold it through an arbitrary sandwich logic.
fn sandwich(lst: &[u8])->[u8; 3]{
    lst.chunks(3).reduce(|x, y| [x[0], y[1], x[0]]).unwrap()
}
/*
3  |     lst.chunks(3).reduce(|x, y| [x[0], y[1], x[0]]).unwrap()
   |                                 ^^^^^^^^^^^^^^^^^^
   |                                 |
   |                                 expected `&[u8]`, found array `[u8; 3]`
   |                                 help: consider borrowing here: `&[x[0], y[1], x[0]]`
*/
fn sandwich2(lst: &[u8])->[u8; 3]{
    let mut r: [u8; 3] = lst[..].try_into().unwrap();
    for i in (3..lst.len()).step_by(3) {
        let y = &lst[i..i + 3];
        r = [r[0], y[1], r[0]];
    }
    r
}