下面的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
}
errorE0277:在编译时无法知道
[fn() -> isize]
类型值的大小-> src/main.rs:5:21 ^不具有编译时已知的大小:属性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()
})];
那么,我如何存储一系列闭包呢?
发布于 2021-11-10 03:00:41
问题不在fn指针中,而是数组没有大小。只需将预期的大小添加到数组声明中即可解决:
const solution_fns: [fn() -> usize; 1] =
[|| (1..=999usize).filter(|&e| divides(3, e) || divides(5, e)).sum()];
发布于 2022-01-20 01:47:28
如果使用片,则不必指定大小:
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
}
https://stackoverflow.com/questions/69910269
复制相似问题