David Asked: 2024-01-08 21:46:14 +0800 CST2024-01-08 21:46:14 +0800 CST 2024-01-08 21:46:14 +0800 CST Rust 无法推断 Fn 类型,其中 Option<Fn> 为 None [重复] 772 所以我遇到了这种情况,Rust 无法推断函数的泛型类型参数,该函数采用可选的 Fn 作为参数。当传递None给它时,似乎泛型类型参数已经过时了,但是 Rust 需要知道它们的值来编译,而我不知道该告诉他什么。我尝试过foo::<(), ()>(calculation_result, None),但这不起作用。 有谁知道我如何在传递而不是闭包foo时调用这个函数?None有我可以指定的虚拟类型吗? generics 2 个回答 Voted rodrigo 2024-01-08T21:56:26+08:002024-01-08T21:56:26+08:00 这是一个已知问题,已经影响了生态系统中的许多库,例如Gtk: 目前,我知道的最好的解决方法是声明一个None具有虚拟类型的相关值的常量,如Gtk我上面链接的包。 在您的特定情况下,更容易使用的类型F是基本类型fn(),注释语法None是涡轮鱼,例如:Option::<fn()>::None。 Best Answer Alexandre Senges 2024-01-08T22:16:26+08:002024-01-08T22:16:26+08:00 问题是调用一个带有未指定参数的函数。 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
这是一个已知问题,已经影响了生态系统中的许多库,例如Gtk:
目前,我知道的最好的解决方法是声明一个
None
具有虚拟类型的相关值的常量,如Gtk
我上面链接的包。在您的特定情况下,更容易使用的类型
F
是基本类型fn()
,注释语法None
是涡轮鱼,例如:Option::<fn()>::None
。问题是调用一个带有未指定参数的函数。
您必须手动指定类型。请记住,Option 会根据 Box 的大小(而不是 Box + 1 的大小)进行优化,并且在 None 情况下不会分配。