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
}