gpt4 book ai didi

rust - 为什么 `&value.into_something()` 仍然导致移动值?

转载 作者:行者123 更新时间:2023-11-29 08:22:45 25 4
gpt4 key购买 nike

我正在努力了解这是如何转移所有权的。这是我的代码:

let res = screenshot::take_screenshot(0);
let file = File::open("test.png").expect("Failed to open file");

let encoder = PNGEncoder::new(file);
encoder.encode(&res.into_raw(),
res.width(),
res.height(),
ColorType::RGBA(0)
);

screenshot::take_screenshot是一个返回 ImageBuffer<Rgba<u8>, Vec<u8>> 的函数.这是我得到的编译器错误:

error[E0382]: use of moved value: `res`
--> src/main.rs:21:37
|
21 | encoder.encode(&res.into_raw(), res.width(), res.height(), ColorType::RGBA(0));
| --- ^^^ value used here after move
| |
| value moved here
|
= note: move occurs because `res` has type `image::ImageBuffer<image::Rgba<u8>, std::vec::Vec<u8>>`, which does not implement the `Copy` trait

error[E0382]: use of moved value: `res`
--> src/main.rs:21:50
|
21 | encoder.encode(&res.into_raw(), res.width(), res.height(), ColorType::RGBA(0));
| --- value moved here ^^^ value used here after move
|
= note: move occurs because `res` has type `image::ImageBuffer<image::Rgba<u8>, std::vec::Vec<u8>>`, which does not implement the `Copy` trait

我正在尝试传递一个切片,我认为它是向量的引用,不是吗?这意味着所有权没有传递,矢量也没有移动。我知道我做错了什么,而且可能很简单。

最佳答案

这只是一个运算符优先级问题:方法在引用运算符 & 之前应用:

&(res.into_raw()) // This
(&res).into_raw() // Not this

调用 into_raw取得所有权,值(value)就消失了。

你可以这样做:

let w = res.width();
let h = res.height();
let r = res.into_raw();
encoder.encode(&r, w, h, ColorType::RGBA(0));

可能有更好的东西,但您没有提供 MCVE所以很难迭代解决方案。从文档中盲目猜测,这看起来应该可行:

extern crate image;

use image::{png::PNGEncoder, ColorType, ImageBuffer, Rgba};
use std::io;

fn repro<W: io::Write>(res: ImageBuffer<Rgba<u8>, Vec<u8>>, file: W) -> Result<(), io::Error> {
let encoder = PNGEncoder::new(file);
encoder.encode(&res, res.width(), res.height(), ColorType::RGBA(0))
}

fn main() {}

关于rust - 为什么 `&value.into_something()` 仍然导致移动值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49946620/

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