复合特性不起作用:特性 `std::io::Read` 没有为 `[name]` 实现

时间:2021-04-11 04:19:05

标签: rust

当我作出这样的由两个其他性状的复合性状(名字吗?),编译器似乎没有检测到两个特点是由复合性状实现。

代码如下:

use std::io::{Read, Seek};
use zip::read::ZipArchive;

trait ReadSeek: Read + Seek {}
impl<T: Read + Seek> ReadSeek for T {}

pub struct ArchiveZip<'a> {
    path: &'a str,
    archive: ZipArchive<&'a (dyn ReadSeek)>,
}

这里是错误:

error[E0277]: the trait bound `&'a (dyn ReadSeek + 'a): std::io::Read` is not satisfied
  --> src/archive/zipfile.rs:12:14
   |
12 |     archive: ZipArchive<&'a (dyn ReadSeek)>,
   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::io::Read` is not implemented for `&'a (dyn ReadSeek + 'a)`
   | 
  ::: /Users/nhooey/.cargo/registry/src/github.com-1ecc6299db9ec823/zip-0.5.11/src/read.rs:50:26
   |
50 | pub struct ZipArchive<R: Read + io::Seek> {
   |                          ---- required by this bound in `ZipArchive`
   |
   = note: `std::io::Read` is implemented for `&'a mut (dyn archive::ReadSeek + 'a)`, but not for `&'a (dyn archive::ReadSeek + 'a)`

为什么它没有检测到 ReadSeek trait 没有同时实现 ReadSeek

(I省略了其他错误消息,其也抱怨Seek以同样的方式。)

1 个答案:

答案 0 :(得分:1)

从错误消息中您可以看到:struct ZipArchive<R: Read + io::Seek>。 这意味着 R 的通用参数 (ZipArchive) 必须实现 Readio::Seek

您的代码有:ZipArchive<&'a (dyn ReadSeek)>。 因此,您代码中的 R&'a (dyn ReadSeek),它是一个引用 (&'_ _)。引用指向的对象实现 ReadSeek 的事实不会改变引用本身实现的特征。

因此,您可以为引用实现您的特征(根据我的经验,这通常不会很好),或者您可以找到一种方法让 R 成为直接实现所需特征的类型。 查看参考文档,您可以看到 ReadSeek 是为 mutable references 实现的。因此,将您的引用更改为可变的应该可以解决问题。