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