提问人:hkBst 提问时间:11/10/2021 更新时间:1/20/2022 访问量:765
Rust 中的闭包数组
array of closures in Rust
问:
以下 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()
})];
那么,如何存储闭包数组呢?
答:
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 不幸的是,在 / 中,你不能,只能在 sstatic
const
let
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 环
评论
fn() -> isize
[T]
[T; N]
N
Vec<T>
vec![]