Rust 如何使用相同的可变借用调用serde_json::to_writer两次?

Rust 如何使用相同的可变借用调用serde_json::to_writer两次?,rust,Rust,我试图写一个函数,它调用两次来写两件事,但我不知道怎么写 这里有一个尝试(): extern板条箱serde_json; fn main(){ let mut out=std::fs::File::create(“out.txt”).unwrap(); 写下内容(&mut out); } fn写入内容(输出:&mut W)->结果 哪里 W:std::io::Write, { serde_json::to_writer(out,&1).unwrap();/`out`:值移到此处 serde_js

我试图写一个函数,它调用两次来写两件事,但我不知道怎么写

这里有一个尝试():

extern板条箱serde_json;
fn main(){
let mut out=std::fs::File::create(“out.txt”).unwrap();
写下内容(&mut out);
}
fn写入内容(输出:&mut W)->结果
哪里
W:std::io::Write,
{
serde_json::to_writer(out,&1).unwrap();/`out`:值移到此处
serde_json::to_writer(out,&2).unwrap();/`out`:移动后此处使用的值
好(())
}
编辑:找到了一种编译东西的方法,但是有没有更简单的方法():

extern板条箱serde_json;
fn main(){
let mut out=std::fs::File::create(“out.txt”).unwrap();
写下内容(&mut out);
}
fn写入内容(输出:&mut W)
哪里
W:std::io::Write,
{
写出包装纸;
写出包装纸;
}
fn写入包装器(输出:&mut W)
哪里
W:std::io::Write,
{
serde_json::to_writer(out,&1).unwrap();
}

这种行为的原因有些微妙。当将共享引用作为参数传递给函数时,Rust只会复制该引用。对于所有
T
,类型
&T
Copy
,因为我们可以同时拥有任意数量的共享引用

另一方面,可变引用不是
Copy
,因为在任何给定时间只能有一个。根据非Copy类型的常见Rust语义,这意味着可变引用在作为参数传递时应该被移动。那么为什么这个代码可以工作呢

fn foo(_: &mut i32) {}

fn main() {
    let mut i = 42;
    let r = &mut i;
    foo(r);
    foo(r);
}
原因是编译器在分配给显式声明为可变引用的变量时,会创建一个隐式重新箭头,因此函数调用会转换为
foo(&mut*r)
。这将创建一个仅在函数调用期间持续的新借阅,并且一旦重新借阅的生命周期结束,原始引用
r
将再次可用

但是,隐式重新启动仅为使用可变引用类型显式声明的变量生成。如果我们将上面的
foo()
的定义更改为

fn foo<T>(_: T) {}
由于参数
writer
未声明为可变引用,因此需要创建显式重新箭头以避免移动:

serde_json::to_writer(&mut *out, &1)?;

您在问题中给出的另一种解决方案也能起作用。
write_wrapper()
函数接收一个显式声明的可变引用作为参数,因此对该函数的调用会触发隐式重新启动。

可能与此重复,您只需调用serde_json::to_writer(&mut out,&1).我认为这不是一个完全相同的副本。在另一个问题中,问题是函数拥有所有权,我们需要创建一个借用。在这里,
out
已经是一个可变的借用,但是编译器不会像传递函数调用的可变引用时那样创建隐式重新编译,所以我们需要显式地重新编译
out
serde_json::to_writer(&mut *out, &1)?;