Rust 无法推断其中 Option<Fn> 为 None 的 Fn 类型

问题描述 投票:0回答:2

所以我遇到了这种情况,Rust 无法推断函数的泛型类型参数,该函数采用可选的 Fn 作为参数。 当将

None
传递给它时,似乎泛型类型参数已经过时了,但 Rust 需要知道它们的值才能编译,而我不知道该告诉他什么。我尝试过
foo::<(), ()>(calculation_result, None)
,但不起作用。

有谁知道在传递

foo
而不是闭包时如何调用这个
None
函数?有我可以指定的虚拟类型吗?

generics rust type-inference
2个回答
1
投票

这是一个已知问题,已经影响了生态系统中的许多库,例如Gtk

目前我知道的最好的解决方法是使用虚拟类型的相关

None
值声明一个常量,如我上面链接的
Gtk
板条箱。

在您的特定情况下,更容易用作

F
的类型是基本
fn()
,注释
None
的语法是涡轮鱼,例如:
Option::<fn()>::None


0
投票

问题是调用一个带有未指定参数的函数。

fn foo<F, R>(arg: bool, f: Option<F>) -> MyResult<R>
    where F: Fn() -> R
{...}

foo(true, None); // <- R cannot be inferred

您必须手动指定类型。请记住,Option 会根据 Box 的大小(而不是 Box + 1 的大小)进行优化,并且在 None 情况下不会分配。

let empty: Option<Box<dyn Fn() -> ()>> = None;
foo(true, empty); // <- R is (), Option<Box<>>::None does not allocate
© www.soinside.com 2019 - 2024. All rights reserved.