所以我遇到了这种情况,Rust 无法推断函数的泛型类型参数,该函数采用可选的 Fn 作为参数。 当将
None
传递给它时,似乎泛型类型参数已经过时了,但 Rust 需要知道它们的值才能编译,而我不知道该告诉他什么。我尝试过foo::<(), ()>(calculation_result, None)
,但不起作用。
有谁知道在传递
foo
而不是闭包时如何调用这个 None
函数?有我可以指定的虚拟类型吗?
这是一个已知问题,已经影响了生态系统中的许多库,例如Gtk:
目前我知道的最好的解决方法是使用虚拟类型的相关
None
值声明一个常量,如我上面链接的 Gtk
板条箱。
在您的特定情况下,更容易用作
F
的类型是基本 fn()
,注释 None
的语法是涡轮鱼,例如:Option::<fn()>::None
。
问题是调用一个带有未指定参数的函数。
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