Generics 泛型类型的泛型构造函数的显式类型批注

Generics 泛型类型的泛型构造函数的显式类型批注,generics,rust,idioms,Generics,Rust,Idioms,我正在为一个C库编写一个铁锈绑定。它实现了一个可以从不同的源实体构造的实体,可能会在内部保存一些引用。我希望Rust类型强制执行安全所有权策略,因此包装器结构是泛型的,由存储引用的类型参数化 struct Foobar<T> { origin: T, } 问题来了:结构和构造函数都是独立参数化的。虽然可以从其参数推断构造函数类型参数,但构造函数中未使用struct type参数,因此无法进行推断。因此,调用构造函数的简单方法 let a = Foobar::from_now

我正在为一个C库编写一个铁锈绑定。它实现了一个可以从不同的源实体构造的实体,可能会在内部保存一些引用。我希望Rust类型强制执行安全所有权策略,因此包装器结构是泛型的,由存储引用的类型参数化

struct Foobar<T> {
    origin: T,
}
问题来了:结构和构造函数都是独立参数化的。虽然可以从其参数推断构造函数类型参数,但构造函数中未使用struct type参数,因此无法进行推断。因此,调用构造函数的简单方法

let a = Foobar::from_nowhere();
let b = Foobar::from_orange(&mut fruit);
let c = Foobar::from_callback(|x| x*x);
使人困惑的是C:

    rustgen.rs:43:13: 43:33 error: unable to infer enough type information about `_`; type annotations required [E0282]
    rustgen.rs:43     let a = Foobar::from_nowhere();
可以通过提供一些任意类型的参数来修复:

let a = Foobar::<()>::from_nowhere();
let b = Foobar::<()>::from_orange(&mut fruit);
let c = Foobar::<()>::from_callback(|x| x*x);

据我所知,您的原始代码是在
T
上参数化的,但是您有一些方法想要指定参数。诀窍在于,对于这些情况,不要使用泛型。相反,请尝试为每种感兴趣的类型创建专门的实现:

//这只是一个例子。抑制不相关的警告
#![允许(死\u代码、未使用的\u变量)]
结构Foobar{
来源:T,
}
性状橙{}
结构葡萄柚;
葡萄柚{}的苹果橙
impl Foobar{
fn from_nowhere()->Foobar{
Foobar{origin:()}
}
}
恳求
其中F:橙色
{

fn from_orange(orange:&'a mut F)->FoobarThank you!我没有意识到,对于不同的参数化,可能有多个'impl'子句。
let a = Foobar::<()>::from_nowhere();
let b = Foobar::<()>::from_orange(&mut fruit);
let c = Foobar::<()>::from_callback(|x| x*x);
$ rustc --version
rustc 1.1.0-dev (built 2015-04-26)