再一次:"期望的类型参数,找到结构"

时间:2017-11-10 20:49:04

标签: generics rust

关于此特定错误消息已有几个问题。我读了所有这些,但我无法弄清楚我面临的确切问题是什么,也不知道如何解决它。

我有一个struct对传入的参数有要求,我想提供一些便利函数来构造一个新实例。它来了:

use std::io::{Cursor, Read, Seek};

pub struct S<R: Read + Seek> {
    p: R,
}

impl<R: Read + Seek> S<R> {
    pub fn new(p: R) -> Self {
        S { p }
    }

    pub fn from_string(s: String) -> Self {
        S::new(Cursor::new(s))
    }
}

上面的最小示例给出了以下错误:

error[E0308]: mismatched types
  --> src/main.rs:13:16
   |
13 |         S::new(Cursor::new(s))
   |                ^^^^^^^^^^^^^^ expected type parameter, found struct `std::io::Cursor`
   |
   = note: expected type `R`
              found type `std::io::Cursor<std::string::String>`
   = help: here are some functions which might fulfill your needs:
           - .into_inner()

我尝试了很多变化,但我总是遇到同样的错误。另请注意,使用来自其他位置的光标(例如S::new)调用main可按预期工作。我知道它与泛型有关,等等(从其他类似问题的答案)但是:如何在我的from_* impl中提供struct方法1}}

1 个答案:

答案 0 :(得分:5)

我认为错误信息在这种情况下并不遥远。您的impl说:

impl<R: Read + Seek> S<R>

因此,您的new函数应创建R中可变的类型,但您只提供固定类型Cursor<String>。试试这个:

use std::io::{Cursor, Read, Seek};

pub struct S<R: Read + Seek> {
    p: R,
}

impl<R: Read + Seek> S<R> {
    pub fn new(p: R) -> Self {
        S { p }
    }

}

impl S<Cursor<String>> {
    pub fn from_string(s: String) -> Self {
        S::new(Cursor::new(s))
    }
}