如何在rust函数中传递默认的泛型类型



所以我有一个名为cr的函数,我希望泛型T默认为serde_json::Value。我该怎么做?

fn main() {
cr()
}
fn cr<T = serde_json::Value>() {
}

我在调用cr时得到了这个错误:cannot infer type for type parameter T declared on the function cr。在cr函数上,我得到了这个错:defaults for type parameters are only allowed in struct, enum, type, or trait definitions.

由于错误,您不能在函数签名中使用默认类型参数。您可以使用包装器类型来解决此问题。

use std::marker::PhantomData;
struct MyDefault;
struct Custom;
pub fn main() {
Wrapper::cr(); //~ ERROR type annotations needed
<Wrapper>::cr();
Wrapper::<Custom>::cr();
<Wrapper<Custom>>::cr();
}
struct Wrapper<T = MyDefault>(PhantomData<T>);
impl<T> Wrapper<T> {
fn cr() {
let _: T = todo!();
}
}

推理无法猜测,因此它需要一个可用于替换的类型提示。例如CCD_ 6或完全限定路径CCD_。省略此处的替换将触发SomeType中的默认替换。

以下是的诀窍

type Echo<X = i32> = std::result::Result<X, String>;
fn test(x: Echo) {
// ...
}
fn main() {
test(Err("test".into()));
}

最新更新