当前位置: 首页 > 知识库问答 >
问题:

锈迹斑斑的闭合阵列

李言
2023-03-14

下面的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]:[fn()-类型值的大小

我知道你不能构造一个在编译时大小未知的数组(或Vec)。但是我理解类型< code>[fn() -

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

那么,如何存储一系列闭包呢?


共有2个答案

东门俊民
2023-03-14

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

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
}

链接到游乐场。

华阳秋
2023-03-14

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

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

游戏场

 类似资料:
  • 我有一个,它实现了Futures的特征: 我想把它传递给actix_web的方法。 我认为解决方案是my,但我找不到这样的流方法。 下面是如何使用的示例:

  • 我尝试在我的DB中更新一个表“image”并插入blob类型。 ImageClass: Hibernate用户映射: 利布: 错误:

  • 已挂, 查看状态变更为业务面试-未录用 -------------------------------------------------------- 1. 深挖项目,需要对自己的项目和类似开源项目,用到的框架技术有深入了解 2. Redis 3. MySQL 4. 消息队列 5. GC相关 反问 拷打约50分钟 面试官水平很高,也会根据你的回答引导,可惜自己太菜了,很多没回答上来

  • Flare objects are the source assets that are used by Lens Flare Components. The Flare itself is a combination of a texture file and specific information that determines how the Flare behaves. Then whe

  • 问题内容: 对于跨进程的数据通信,我打算使用Redis列表。生产者推送到列表,而一组使用者使用BRPOP消费列表内容。 为了限制列表的大小无限增长,我想将列表大小限制为固定值(例如1万个项目)。我很惊讶地没有找到像BLPUSH或BRPUSH这样的等效命令。这是Redis员工故意遗漏的吗? 因此,我假设我必须在推送之前使用Watch / multi创建一个Txn来检查列表大小。这是正确的方法还是可用

  • 本文向大家介绍azure-webjobs 斑点触发,包括了azure-webjobs 斑点触发的使用技巧和注意事项,需要的朋友参考一下 示例 修改Azure存储Blob时触发的一个简单函数示例: