gpt4 book ai didi

rust - 文件结构不被视为实现读取?

转载 作者:行者123 更新时间:2023-11-29 08:12:32 27 4
gpt4 key购买 nike

我正在制作一个特征,它将从各种文件格式中读取/解码为特定对象。该特征有一个通用的 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 implement std::io::Read?

是的。但是考虑一下你的特征的实现:

impl MyObjectReader for SomeReaderImpl {
type R = AnythingYouLike;
// .. etc
}

问题是 R 可能File,但也可能不是。

您的默认实现假设 RFile,因此也许该实现应该在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com