将通用Result <T,E>定义为返回类型

nat*_*ore 3 generics traits rust

我想创建一个trait强制Result<T, E>某些函数的返回类型,但我无法弄清楚定义它的语法.

我已经达到了:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

error: mismatched types: 
    expected 'T', 
    found 'i32'
(expected type parameter, found i32) [E0308]
Run Code Online (Sandbox Code Playgroud)

所以我接着尝试了:

pub fn bar<i32, String>(&self) -> NamedResult<i32, String> {
    Ok(78i32)
}
Run Code Online (Sandbox Code Playgroud)

并收到以下错误:

error: user-defined types or type parameters cannot shadow the primitive types [E0317]
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*gan 6

fn bar<T, E>(&self) -> Result<T, E>;
Run Code Online (Sandbox Code Playgroud)

这是说你有一个函数bar其中,任意给定类型TE,将返回Result<T, E>.请记住:用户指定类型.但是你的方法正在做的是返回a Result<i32, _>,但i32不是T.

如果希望指定将返回的类型,则需要在特征实现上指定,作为通用或(更常见)作为关联类型:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @nathansizemore:"无论用户想要什么",作为一个概念根本没有意义.你的代码必须以某种方式产生任何类型的值 - 它将如何做? (3认同)