当泛型函数需要一个参数为时T,为什么它要使用参数为&mut T?
我试图使用serialize_into和serialize_from在bincode板条箱中将字符串序列化到文件。签名是
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将是必要的,但Write并Read没有为他们实现。但是,如果&mut f1和&mut f2被使用,则会进行编译。为什么在功能签名中需要&mut Wa时可以使用它们W?
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))),它仍会编译并具有相同的语义。
需要注意的是服用R: Read并W: Write通过值由推荐锈API指南。