我正在制作一个特征,它将从各种文件格式中读取/解码为特定对象。该特征有一个通用的 std::io::Read
类用于内部读取器对象。我正在尝试制作一个方便的 from_filename
构造函数,它将打开文件并使用它。但是我似乎无法让它工作。
这是代码:
use std::io::Read;
use std::fs;
use std::path::Path;
trait MyObjectReader {
type R: Read;
fn new(Self::R) -> Self;
fn from_filename(filename: &str) -> Self where Self: Sized {
let open_file = fs::File::open(&Path::new(filename)).unwrap();
Self::new(open_file)
}
// other methods will go here
}
然后我得到这个错误:
rustc 1.15.1 (021bd294c 2017-02-08)
error[E0308]: mismatched types
--> <anon>:14:19
|
14 | Self::new(open_file)
| ^^^^^^^^^ expected associated type, found struct `std::fs::File`
|
= note: expected type `<Self as MyObjectReader>::R`
= note: found type `std::fs::File`
我知道 .unwrap()
在库中低于标准,我稍后会更改。
我无法理解这个错误,因为 std::fs::File
没有实现 std::io::Read
吗?在我看来它应该有效。
最佳答案
doesn't
std::fs::File
implementstd::io::Read
?
是的。但是考虑一下你的特征的实现:
impl MyObjectReader for SomeReaderImpl {
type R = AnythingYouLike;
// .. etc
}
问题是 R
可能是File
,但也可能不是。
您的默认实现假设 R
是 File
,因此也许该实现应该在 R
是 的特定实例中进行肯定是 文件
:
use std::io::Read;
use std::fs;
trait MyObjectReader {
type R: Read;
fn new(Self::R) -> Self;
fn from_filename(filename: &str) -> Self where Self: Sized;
}
struct MyFileReader;
impl MyObjectReader for MyFileReader {
type R = fs::File;
fn new(_: Self::R) -> Self {
MyFileReader
}
fn from_filename(filename: &str) -> Self
where Self: Sized
{
let open_file = fs::File::open(filename).unwrap();
Self::new(open_file)
}
}
关于rust - 文件结构不被视为实现读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42735664/