【发布时间】:2019-03-20 18:03:17
【问题描述】:
我有一个相关类型的特征:
pub trait Speak {
type Error;
fn speak(&self) -> Result<String, Self::Error>;
}
该特征的实现:
#[derive(Default)]
pub struct Dog;
impl Speak for Dog {
type Error = ();
fn speak(&self) -> Result<String, Self::Error> {
Ok("woof".to_string())
}
}
还有一个返回该实现实例的函数:
pub fn speaker() -> impl Speak {
Dog::default()
}
我知道在这个例子中我可以只使用Dog作为返回类型,但是在我的实际代码中我必须使用impl Speak来代替(上面的函数实际上是由一个宏生成的)。
据我了解,impl Trait 表示法让编译器可以确定实际返回的具体类型,所以我希望以下函数能够正确编译,因为speaker() 返回一个Dog,而Dog::Error 是类型():
fn test() -> Result<String, ()> {
speaker().speak()
}
相反,我收到以下错误:
error[E0308]: mismatched types
--> src/lib.rs:21:5
|
20 | fn test() -> Result<String, ()> {
| ------------------ expected `std::result::Result<std::string::String, ()>` because of return type
21 | speaker().speak()
| ^^^^^^^^^^^^^^^^^ expected (), found associated type
|
= note: expected type `std::result::Result<_, ()>`
found type `std::result::Result<_, <impl Speak as Speak>::Error>`
就好像编译器无法(此时)推断出speaker 函数的返回类型。
谁错过了什么,编译器还是我自己?
【问题讨论】:
标签: rust traits type-inference