gpt4 book ai didi

rust - 如何在 Rust 中选择合适的 trait 实现?

转载 作者:行者123 更新时间:2023-11-29 08:28:18 25 4
gpt4 key购买 nike

我有一个期望 reqwest::Response 的特质或 Vec作为论点,只是把它们扔进 select::document::Document .为此,我需要以某种方式获得 io::Read 的实现。对于 Vec<u8>为了使用 Document::from_read .

这是我想出的:

use select::document::Document;
use std::{io::Read, io::Result};

#[derive(Debug)]
pub struct ReadableVec<T>(Vec<T>);

impl Read for ReadableVec<u8> {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
println!("Read!");
let mut r: &[u8] = &self.0[..];
r.read(buf) //< issue is here!!
}
}

fn main() {
let buf = ReadableVec(vec![60, 116]);
let doc = Document::from_read(buf);
println!("{:?}", doc)
}

我的问题是:为什么 r.read(buf)调用 Read实现ReadableVec而不是 &[u8] ,从而使我的函数递归调用自身? r 的类型上面的行似乎非常清楚地指示了。

PS:如果有更好的解决方案来处理这两个 Vec<u8>reqwest::Response ,会在评论中表示赞赏! ;)

最佳答案

您可以通过直接引用特征方法来消除歧义,例如:

use std::io::Read;

#[derive(Debug)]
pub struct ReadableVec<T>(Vec<T>);

impl Read for ReadableVec<u8> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
println!("Read!");
Read::read(&mut &self.0[..], buf)
}
}

fn main() {
let mut buf = ReadableVec(vec![60, 116]);
buf.read(&mut []);
}

这叫做 Universal Function Call Syntax (新书找不到这一章,所以链接第一版)。

我认为这不足以使 Read 的实现正确,因为这只会推进(临时)切片。请参阅我对 Cursor 的评论。

关于rust - 如何在 Rust 中选择合适的 trait 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58365520/

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