Rust 如何处理;在循环的上一次迭代中使用移动值;当给一个作家写信的时候?

Rust 如何处理;在循环的上一次迭代中使用移动值;当给一个作家写信的时候?,rust,Rust,我遇到以下代码错误: 使用std::fs::File; 使用std::io::{BufWriter,Write}; fn mandel_颜色(i:f32,mut编写器:BufWriter){ 设ir=16.0*(i%15.0); 设ig=32.0*(i%7.0); 设ib=8.0*(i%31.0); write!(&mut writer,“{}{}{}\n”,ir,ig,ib).expect(“无法写入文件”); } fn mandel_iter(cx:f32,cy:f32)->f32{ 设mu

我遇到以下代码错误:

使用std::fs::File;
使用std::io::{BufWriter,Write};
fn mandel_颜色(i:f32,mut编写器:BufWriter){
设ir=16.0*(i%15.0);
设ig=32.0*(i%7.0);
设ib=8.0*(i%31.0);
write!(&mut writer,“{}{}{}\n”,ir,ig,ib).expect(“无法写入文件”);
}
fn mandel_iter(cx:f32,cy:f32)->f32{
设mut对=(0.0,0.0);
让mut count=0.0;
而f32::sqrt(f32::powf(pair.0,2.0)+f32::powf(pair.1,2.0))<2.0&&count<255.0{
pair=((f32::powf(pair.0,2.0)-f32::powf(pair.1,2.0)+cx),(2.0*pair.0*pair.1+cy));
计数+=1.0;
}
计数
}
fn mandelbrot(宽:i32,高:i32){
让file=file::create(“img/image.ppm”).expect(“无法创建image.ppm”);
让mut writer=BufWriter::new(&file);
write!(&mut writer,“P3\n{}{}\n255\n”,宽度、高度);
对于0..width中的x{
对于0.高度中的j{
设x_ish=((x为f32-宽度为f32*11.0/15.0)/(宽度为f32/3.0))为f32;
设y_ish=((j为f32-高度为f32*2.0)/(高度为f32*3.0/10.0))为f32;
//如何在这里修复writer的错误?
mandel_color(作家mandel_iter,x_ish,y_ish);
}
}
}
fn main(){
常量图像宽度:i32=256;
常量图像高度:i32=256;
mandelbrot(图像高度、图像宽度);
}
错误[E0382]:使用移动值:`writer`
-->src/main.rs:32:53
|
25 |让mut writer=BufWriter::new(&file);
|------------发生移动是因为'writer'具有'BufWriter'类型,该类型未实现'Copy'特性
...
32 | mandel_color(mandel_iter(x_ish,y_ish),作家);
|^^^^^值在循环的上一次迭代中移动到此处

我尝试使用
#[派生(复制)]
Writer
设置一个结构,但是
BufWriter
无法实现
Copy
特性。。。所以我不确定该怎么处理这个案子

如何处理循环中的移动值?具体而言,本部分:

mandel_color(mandel_iter(x_ish,y_ish),作家);

原始代码将值移动到
mandel\u color()
,这不仅意味着调用方无法继续使用它,而且
mandel\u color
将拥有writer,因此在写入单个三元组且
writer
超出范围时关闭它。这种所有权转让肯定不是有意的

您可以通过不移动值来防止所有权转移并修复“移动值”错误,在这种情况下,只需让
mandel\u color
接受对编写器的引用即可:

fn mandel_color(i: f32, writer: &mut BufWriter<&File>) {
    let ir = 16.0 * (i % 15.0);
    let ig = 32.0 * (i % 7.0);
    let ib = 8.0 * (i % 31.0);
    write!(writer, "{} {} {}\n", ir, ig, ib).expect("unable to write to file.");
}
通过使
mandel_color
与实现
Write
特性的任何类型一起工作,您还可以使
mandel_color
更通用(而不损失性能)。这样,您就不必详细说明确切的类型
BufWriter
,您的代码将在写入网络套接字、标准输出、内存等的输出上保持不变:

fn mandel_color(i: f32, mut writer: impl Write) {
    let ir = 16.0 * (i % 15.0);
    let ig = 32.0 * (i % 7.0);
    let ib = 8.0 * (i % 31.0);
    write!(writer, "{} {} {}\n", ir, ig, ib).expect("unable to write to file.");
}

根据实现,您不需要在
mandel\u color
中拥有写入程序的所有权,它应该这样定义:
fn mandel\u color(i:f32,writer:&mut BufWriter)
。那是一个打字错误(调试)。但你的解决方案正是我所需要的。谢谢
fn mandel_color(i: f32, mut writer: impl Write) {
    let ir = 16.0 * (i % 15.0);
    let ig = 32.0 * (i % 7.0);
    let ib = 8.0 * (i % 31.0);
    write!(writer, "{} {} {}\n", ir, ig, ib).expect("unable to write to file.");
}