gpt4 book ai didi

rust - 如何将reduce应用于 block (来自借用的对数组的引用)?

转载 作者:行者123 更新时间:2023-12-03 11:36:10 24 4
gpt4 key购买 nike

如何使用功能模式而不会产生借用问题?编译器提出的解决方案会导致另一个错误(expected array [u8; 3] , found '&[u8]'),并且会无限期地从一个错误变为另一个不同的错误。
对于像other question这样的简单任务,一些相关代码似乎过于复杂。

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]]`
*/
我能写的最好的可编译代码就是这个令人费解的代码,完全放弃了 reduce:
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
}
请注意,三明治只是说明问题的一个示例(实际上没有任何作用)。我希望有一个外部复杂得多的函数,而不是该lambda函数。

最佳答案

您必须以某种方式将值的所有权放入必需的[u8; 3]中。
可能是使用iterator_fold_self功能的此示例(按今天每晚):

#![feature(iterator_fold_self)]

/// Take an array representing a sequence of 3-tuples and reduce it through an arbitrary sandwich logic.
fn sandwich(lst: &[u8]) -> [u8; 3] {
lst.chunks(3)
.map(|x| [x[0], x[1], x[2]])
.reduce(|x, y| [x[0], y[1], x[0]])
.unwrap()
}

fn main() {
let test_set = [1, 2, 3, 1, 2, 3];
println!("{:?}", sandwich(&test_set));
}

Playground
您可以使用 try_into(来自此 famous answer)来获取拥有的切片:
fn sandwich(lst: &[u8]) -> [u8; 3] {
lst.chunks(3)
.map(|x| -> [u8; 3] { x.try_into().unwrap() } )
.reduce(|x, y| [x[0], y[1], x[0]])
.unwrap()
}
Playground

关于rust - 如何将reduce应用于 block (来自借用的对数组的引用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66523999/

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