将泛型 Result<T, E> 定义为 return 类型

Defining generic Result<T, E> as return type

我想创建一个 trait 来在某些函数上强制使用 Result<T, E> 的 return 类型,但我无法弄清楚定义它的语法。

我已经达到:

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)
    }
}

产生以下错误:

error: mismatched types: 
    expected 'T', 
    found 'i32'
(expected type parameter, found i32) [E0308]

所以我尝试了:

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

并收到以下错误:

error: user-defined types or type parameters cannot shadow the primitive types [E0317]

正确的语法是什么,以便我可以强制所述特征的实现者在某些函数上 return 一个 Result<T, E> 类型?

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

这表示您有一个函数 bar,给定任意类型 TE,它将 return 变成 Result<T, E>。请记住:用户指定类型。但是你的方法的主体正在做的是 returning a Result<i32, _>,但 i32 不是 T.

如果希望指定将被return编辑的类型,需要在特征实现中指定,作为通用或(更通常) 作为关联类型:

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)
    }
}

这样,用户没有指定类型;相反,当您知道要在 Thing 上调用 bar 方法时,您就知道输出类型将为 Result<i32, ()>.