Rust将无参数闭包存入数组报E0277错误如何解决
错误根源
该编译错误与函数指针本身无关,问题出在数组类型的语法使用错误:
- Rust 中
[T]为动态大小的切片类型,无固定编译期长度,未实现Sizedtrait,无法直接作为变量的持有类型 - 固定长度数组的正确语法为
[T; N],其中N为数组长度,代码中漏掉了长度声明,因此触发了大小未知的报错。
fn() -> isize本身是标准的函数指针类型,占用一个usize大小的内存空间,完全满足Sized trait的要求。之前用Box包裹的写法也只是因为同样漏掉了数组长度声明才无法编译。
修复方案
方案1:无捕获闭包直接用函数指针数组
你使用的闭包没有捕获任何外部变量,可以直接隐式转换为函数指针,只要补全数组长度即可正常运行:
fn main() { println!("The answer is: {}", solution_fns[0]()); } // 补全数组长度为1,类型修正为[fn() -> isize; 1] const solution_fns: [fn() -> isize; 1] = [|| (1..=999).filter(|e| divides(3, e) || divides(5, e)).sum()]; fn divides(d: usize, n: &usize) -> bool { n % d == 0 }
方案2:有捕获闭包用 trait 对象数组
如果后续需要使用捕获了外部变量的闭包(无法转换为函数指针),就用Box<dyn Fn() -> isize> trait 对象存储,同样补全数组长度即可:
fn main() { // 示例:闭包捕获外部变量upper let upper = 999; let solution_fns: [Box<dyn Fn() -> isize>; 1] = [ Box::new(move || (1..=upper).filter(|e| divides(3, e) || divides(5, e)).sum()) ]; println!("The answer is: {}", solution_fns[0]()); } fn divides(d: usize, n: &usize) -> bool { n % d == 0 }
如果需要运行时动态增减数组元素,把固定长度数组替换为Vec<Box<dyn Fn() -> isize>>即可。
内容的提问来源于stack exchange,提问作者hkBst
相关产品推荐
相关产品推荐

