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>某些函数的类型?
fn bar<T, E>(&self) -> Result<T, E>;
Run Code Online (Sandbox Code Playgroud)
这是说你有一个函数bar其中,任意给定类型T和E,将返回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, ()>.
| 归档时间: |
|
| 查看次数: |
3628 次 |
| 最近记录: |