gpt4 book ai didi

rust - 期望 `T: Read` 或 `T: Write` 的通用函数如何接受参数 `&mut T` ?

转载 作者:行者123 更新时间:2023-11-29 07:53:24 25 4
gpt4 key购买 nike

当泛型函数需要T 的参数时,为什么它要使用&mut T 的参数?

我尝试使用 bincode 箱子中的 serialize_intoserialize_from 将字符串序列化为文件。签名是

pub fn serialize_into<W, T: ?Sized>(writer: W, value: &T) -> Result<()>
where
W: std::io::Write,
T: serde::Serialize

pub fn deserialize_from<R, T>(reader: R) -> Result<T>
where
R: std::io::Read,
T: serde::de::DeserializeOwned

我尝试使用 std::BufWriterBufReader 进行序列化,但它似乎只适用于 &mut BufWriter

考虑一下:

use bincode;
use std::io::{BufWriter, BufReader};
use std::fs::File;

fn main() {
let x = String::from("hello");
let mut f1 = BufWriter::new(File::create("foo.txt").unwrap());
bincode::serialize_into( &mut f1, &x).unwrap();
let mut f2 = BufReader::new(File::open("foo.txt").unwrap());
let y: bincode::Result<String> = bincode::deserialize_from( &mut f2);
println!("{:?}", y);
}

因为我需要多次写入和读取,所以我认为需要 &BufWriter&BufReader,但是 WriteRead 没有为他们实现。但是,如果使用 &mut f1&mut f2 则编译。为什么在函数签名中需要W时可以使用这些&mut W

最佳答案

All &mut R where R: Read implement Read :

impl<R: Read + ?Sized, '_> Read for &'_ mut R 

实现将所有调用委托(delegate)给 **self ,所以编译器是这样工作的:

  • &mut BufReader&mut R where R: Read 的一个例子
  • &mut R where R: ReadR where R: Read 的一个例子

唯一涉及的魔法是允许 &mut R 的一揽子实现实现Read .

此外,这个规则可以传递应用,所以当你通过&mut (&mut (&mut (&mut buf_reader))) ,它仍然可以编译并具有相同的语义。

applies to Write Box<dyn Read> also works .

注意取R: ReadW: Write按值(value)推荐Rust API Guidelines .

关于rust - 期望 `T: Read` 或 `T: Write` 的通用函数如何接受参数 `&mut T` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57386539/

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