无法向结构体成员添加特质限定。

3
我试图使用一个泛型类型 R,并保留 Read 类型边界,以便可以访问 Read trait,并进而支持 bytes() 方法。具体来说,我希望将 std::io::Cursor 与此相关联。
以下是我的结构体定义:
struct Parse<'parse, R: Read + BufRead + 'parse> {
    tokens: Vec<Token>,
    source: Cursor<&'parse mut R>,
}

假设我有一个变量parser,它是Parse的一个实例,我想调用parser.source.bytes()方法。尽管在R周围有注释,但编译器告诉我R未满足std::io::Read trait限制。
以下是上下文中的代码片段以及与之相关的Playground直链:
// using Cursor because it tracks position internally
use std::io::{Cursor, Read, BufRead};

struct Token {
    start: usize,
    end: usize,
}

struct Parse<'parse, R: Read + BufRead + 'parse> {
    tokens: Vec<Token>,
    source: Cursor<&'parse mut R>,
}

impl<'parse, R: Read + BufRead + 'parse> Parse <'parse, R> {
    fn new(source: &'parse mut R) -> Self {
        Parse {
            tokens: vec!(),
            source: Cursor::new(source),
        }
    }

    fn parse_primitive(&mut self) -> std::io::Result<Token> {
        let start = self.source.position();
        let bytes = self.source.bytes();                     // <- error raised here

        // dummy work
        for _ in 0..3 {
            let byte = bytes.next().unwrap().unwrap()
        }
        let end = self.source.position();
        Ok(Token { start: start as usize, end: end as usize})
    }
}

fn main() {
    //...
}

生成以下错误信息:
error[E0599]: no method named `bytes` found for type `std::io::Cursor<&'parse mut R>` in the current scope
  --> src/main.rs:24:33
   |
24 |         let bytes = self.source.bytes();
   |                                 ^^^^^
   |
   = note: the method `bytes` exists but the following trait bounds were not satisfied:
           `std::io::Cursor<&mut R> : std::io::Read`
           `&mut std::io::Cursor<&'parse mut R> : std::io::Read`

感谢您的帮助!

1个回答

7

请查看错误信息后的注释:

= note: the method `bytes` exists but the following trait bounds were not satisfied:
        `std::io::Cursor<&mut R> : std::io::Read`
        `&mut std::io::Cursor<&'parse mut R> : std::io::Read`

Cursor<T>Read实现仅在T: AsRef<[u8]>时才定义。如果添加此约束条件,则可以使用Read实现:

impl<'parse, R: AsRef<[u8]> + BufRead + 'parse> Parse <'parse, R> {

你的代码中还有一些其他错误。但是这应该可以回答你的表面问题。

当然,我会在自己的代码中实现并将此答案标记为正确。这确实非常有道理! - Tim McNamara
@TimMcNamara 哎呀!那是一个小笔误。应该是 AsRef<[u8]> - Peter Hall
谢谢你的回复,Peter。你也很正确,还有其他错误。看起来使用游标完全是错误的方法。 - Tim McNamara
1
@TimMcNamara 或许是错误的方法。一个问题是 bytes() 会消耗游标。 - Peter Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接