关于此特定错误消息已有几个问题。我读了所有这些,但我无法弄清楚我面临的确切问题是什么,也不知道如何解决它。
我有一个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}}
答案 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))
}
}