rust 正在尝试将trait实现为“std::io::Read”和“std::fs::DirEntry”

vbopmzt1  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(154)

我正在尝试为impl std::io::Readstd::fs::DirEntry实现我的自定义trait-这个想法是为directores以及文件、缓冲区等实现trait。

use std::fs::DirEntry;
use std::io::Read;

trait MyTrait {}

impl<T> MyTrait for T
where
    T: Read,
{}

impl MyTrait for DirEntry {}

结果我得到了错误

error[E0119]: conflicting implementations of trait `MyTrait` for type `DirEntry`
  --> src/mytrait.rs:11:1
   |
6  | impl<T> MyTrait for T
   | --------------------- first implementation here
...
11 | impl MyTrait for DirEntry {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `DirEntry`
   |
   = note: upstream crates may add a new impl of trait `std::io::Read` for type `std::fs::DirEntry` in future versions

For more information about this error, try `rustc --explain E0119`.

据我所知,我不能同时为impl std::io::Readstd::fs::DirEntry实现MyTrait,因为,不知何故,std::fs::DirEntry已经实现了std::io::Read
然而,我找不到任何有关这一事实的信息在文档中。我试图找到一些东西在源代码中,但我的知识生 rust 的源代码是没有,所以使命失败。
我找到了一个解决方案,其中我应该手动实现MyTraitstd::fs::File,缓冲区等与一些帮助宏(如impl_mytrait),但我想知道我可以在哪里找到有关可能的上游实现的信息-如果可能的话,我想找到比impl_mytrait宏更好的解决方案。

pokxtpni

pokxtpni1#

如果您阅读了注解,就会发现错误不是因为这样的实现已经存在,而是因为
=注意:上游板条箱可能会在未来版本中为std::fs::DirEntry类型添加trait std::io::Read的新实现
这里的“in future versions”表示目前没有这样的实现,但在Rust中是不允许的,因为添加这样的实现对您的机箱来说是一个破坏性的更改(即需要一个主要版本提升),而它只需要从上游机箱进行一个次要版本提升。

相关问题