You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust将无参数闭包存入数组报E0277错误如何解决

错误根源

该编译错误与函数指针本身无关,问题出在数组类型的语法使用错误:

  • Rust 中[T]为动态大小的切片类型,无固定编译期长度,未实现Sized trait,无法直接作为变量的持有类型
  • 固定长度数组的正确语法为[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:06:10