当我作出这样的由两个其他性状的复合性状(名字吗?),编译器似乎没有检测到两个特点是由复合性状实现。
代码如下:
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 没有同时实现 Read
和 Seek
?
(I省略了其他错误消息,其也抱怨Seek
以同样的方式。)
答案 0 :(得分:1)
从错误消息中您可以看到:struct ZipArchive<R: Read + io::Seek>
。
这意味着 R
的通用参数 (ZipArchive
) 必须实现 Read
和 io::Seek
。
您的代码有:ZipArchive<&'a (dyn ReadSeek)>
。
因此,您代码中的 R
是 &'a (dyn ReadSeek)
,它是一个引用 (&'_ _
)。引用指向的对象实现 Read
和 Seek
的事实不会改变引用本身实现的特征。
因此,您可以为引用实现您的特征(根据我的经验,这通常不会很好),或者您可以找到一种方法让 R
成为直接实现所需特征的类型。
查看参考文档,您可以看到 Read
和 Seek
是为 mutable references 实现的。因此,将您的引用更改为可变的应该可以解决问题。