Generics 定义通用结果<;T、 E>;作为返回类型

Generics 定义通用结果<;T、 E>;作为返回类型,generics,rust,traits,Generics,Rust,Traits,我想创建一个trait,在某些函数上强制使用Result的返回类型,但我无法理解定义它的语法 我已经做到了: pub type NamedResult<T, E> = Result<T, E>; pub trait Foo { fn bar<T, E>(&self) -> NamedResult<T, E>; } pub struct Thing; impl Foo for Thing { pub fn bar&

我想创建一个
trait
,在某些函数上强制使用
Result
的返回类型,但我无法理解定义它的语法

我已经做到了:

pub type NamedResult<T, E> = Result<T, E>;

pub trait Foo {
    fn bar<T, E>(&self) -> NamedResult<T, E>;
}

pub struct Thing;

impl Foo for Thing {
    pub fn bar<T, E>(&self) -> NamedResult<T, E> {
        Ok(78i32)
    }
}
于是我试着:

pub fn bar<i32, String>(&self) -> NamedResult<i32, String> {
    Ok(78i32)
}
正确的语法应该是什么,以便我可以强制上述特性的实现者在某些函数上返回
结果
类型

fn bar<T, E>(&self) -> Result<T, E>;

这样,用户没有指定类型;相反,当您知道正在对
对象调用
bar
方法时,您知道输出类型将是
结果

为什么
名称结果
?这一部分完全是一个骗局。@chrismorge它一开始是
NamedResult=Result
,但当我得到第一批错误时,我就不再这样做了。实现这个特性会是什么样子,这样
Result
,类型就可以是用户想要的任何类型?或者不可能指定它必须返回一个结果,只返回一个类型定义的结果?最终,编译器必须知道返回类型有多大。函数必须具有编译时已知的返回类型。@nathansizemore:“用户想要什么”作为一个概念根本没有意义。您的代码必须以某种方式生成一个任何类型的值,它将如何生成?我有一个相当愚蠢的想法,允许用户通过回调来初始化我的库,哪一个是错误回调,当发生错误时,我会将该错误传递到错误回调。使用上面的方法,它可以用于任何类型的错误或返回值,但是现在您已经指出了这一点,我可以看出它实际上是多么无用。
error: user-defined types or type parameters cannot shadow the primitive types [E0317]
fn bar<T, E>(&self) -> Result<T, E>;
pub trait Foo {
    type Bar;
    type BarError;

    fn bar(&self) -> Result<Self::Bar, Self::BarError>;
}

pub struct Thing;

impl Foo for Thing {
    type Bar = i32;
    type BarError = ();

    pub fn bar(&self) -> Result<i32, ()> {
        Ok(78i32)
    }
}