期待`T:Read`或`T:Write`的泛型函数如何接受自变量`&mut T`?

new*_*eee 4 rust

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

我试图使用serialize_intoserialize_frombincode板条箱中将字符串序列化到文件。签名是

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

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

我尝试使用std::BufWriter和进行序列化,BufReader但似乎只能使用&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);
}
Run Code Online (Sandbox Code Playgroud)

当我需要写入和读取不止一次,我想了&BufWriter&BufReader将是必要的,但WriteRead没有为他们实现。但是,如果&mut f1&mut f2被使用,则会进行编译。为什么在功能签名中需要&mut Wa时可以使用它们W

SOF*_*OFe 5

所有&mut R在那里R: Read实现Read

impl<R: Read + ?Sized, '_> Read for &'_ mut R 
Run Code Online (Sandbox Code Playgroud)

这些实现将所有调用委托给**self,因此编译器的工作方式如下:

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

唯一涉及的魔术是允许&mut R实施的全面实施Read

另外,此规则可以传递应用,因此当您通过时&mut (&mut (&mut (&mut buf_reader))),它仍会编译并具有相同的语义。

同样适用于Write并且Box<dyn Read>也有效

需要注意的是服用R: ReadW: Write通过值由推荐锈API指南