Rust 中的闭包数组

array of closures in Rust

提问人:hkBst 提问时间:11/10/2021 更新时间:1/20/2022 访问量:765

问:

以下 Rust 代码尝试将零个参数的闭包存储在数组中并调用该函数。

fn main() {
    println!("The answer is: {}", solution_fns[0]());
}

const solution_fns: [fn() -> isize] =
    [|| (1..=999).filter(|e| divides(3, e) || divides(5, e)).sum()];

fn divides(d: usize, n: usize) -> bool {
    n % d == 0
}

链接到 Rust playground。不幸的是,它不能编译:

错误 [E0277]: 类型值的大小不能为 编译时已知 --> src/main.rs:5:21 |5 |常量 solution_fns: [fn() -> isize] = |
^^^^^^^^^^^^^^^ 在编译时没有已知的大小 |= help:该特征未实现
[fn() -> isize]Sized[fn() -> isize]

我知道你不能构造一个在编译时不知道大小的东西的数组(或 Vec)。但是,我理解该类型是函数指针数组,我不明白为什么函数指针不应该具有已知的大小。将封口贴在盒子里似乎没有帮助:[fn() -> isize]

const solution_fns: [Box<fn() -> isize>] = [Box::new(|| {
    (1..=999).filter(|e| divides(3, e) || divides(5, e)).sum()
})];

那么,如何存储闭包数组呢?

阵列 Rust 闭包

评论

1赞 Sven Marnach 11/10/2021
该类型具有已知的大小 - 它只是一个指针。问题是没有已知的大小。尝试改用闭包数,或使用 和 宏。fn() -> isize[T][T; N]NVec<T>vec![]
0赞 Sven Marnach 11/10/2021
另请参阅此相关答案
1赞 E_net4 11/10/2021
这回答了你的问题吗?如何在 Rust 函数中返回数组

答:

4赞 Netwave 11/10/2021 #1

问题不在于 fn 指针,而在于您的数组没有大小。只需将预期大小添加到数组声明中即可解决:

const solution_fns: [fn() -> usize; 1] =
    [|| (1..=999usize).filter(|&e| divides(3, e) || divides(5, e)).sum()];

操场

评论

0赞 hkBst 11/10/2021
我看到我似乎误解了错误消息。谢谢你让我直截了当。是否可以让编译器推断数组的长度?
0赞 Filipe Rodrigues 11/10/2021
@hkBst 不幸的是,在 / 中,你不能,只能在 sstaticconstlet
4赞 hkBst 11/10/2021
显然你可以这样做:const SOLVERS: &[fn() -> usize] = &[|| (1..=999).filter(|&e| divides(3, e) || divides(5, e)).sum()];
0赞 embradley 6/10/2023
更好的是,只需组成一个数字 N 并说数组是 [T;N],然后 LSP 会告诉你 N 是否错误,它会告诉你数组中元素的实际数量,以便你修复它。
0赞 hkBst 1/20/2022 #2

如果使用切片,则不必指定大小:

fn main() {
    println!("The answer is: {}", SOLVERS[0]());
}

const SOLVERS : &[fn() -> usize] =
    &[|| (1..=999).filter(|&e| divides(3, e) || divides(5, e)).sum()];

fn divides(d: usize, n: usize) -> bool {
    n % d == 0
}

链接到操场


上一个:Swift:捕获列表

下一个:带闭合的 For 环