将泛型 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
,给定任意类型 T
和 E
,它将 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, ()>
.
我想创建一个 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
,给定任意类型 T
和 E
,它将 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, ()>
.