gpt4 book ai didi

generics - 使此函数通用时如何满足特征界限?

转载 作者:行者123 更新时间:2023-12-03 11:36:29 24 4
gpt4 key购买 nike

我一直在使用 image-rs (0.23.12) 库来实现一些基本的图像分析功能,通过学习 Rust(我来自 Javascript/Python 背景)。我通过 image-rs 为此目的提供的迭代器访问像素数据。这是一个函数的最小示例,它接受对图像子区域 (image::SubImage) 的引用并遍历其中的像素,并与每个像素进行比较。
(游乐场link)

extern crate image;

use image::{GenericImageView, SubImage, ImageBuffer, Luma};

fn main() {
let grey_image = ImageBuffer::new(300, 200);

let subimg = grey_image.view(100, 100, 20, 20);

find_dark_pixels(&subimg);
}

fn find_dark_pixels(img: &SubImage<&ImageBuffer<Luma<u8>, Vec<u8>>>)
{
static WHITE: Luma<u8> = Luma([255]);
let mut pixel_iter = img.pixels();
if pixel_iter.any(|(_, _, pixel)| pixel != WHITE) {
println!("Found dark pixels!");
}
}
( image::Luma 是一个单色像素。)这个非通用版本的函数编译和运行得很好。但是,它确实需要参数是 SubImage没有别的了。不是很有用 - 它确实需要根据需要对整个图像或一个子集进行操作。允许这样做的特征是 GenericImageView ,以及 Image 和 SubImage实现它。
我的第一次尝试是将函数签名更改为:
fn find_dark_pixels<I: GenericImageView>(img: &I)
这从编译器中得出:
binary operation `!=` cannot be applied to type `<I as GenericImageView>::Pixel`
the trait `std::cmp::PartialEq` is not implemented for `<I as GenericImageView>::Pixel` rustc(E0369)
image-rs 中的像素类型确实实现了 PartialEq ,所以我告诉编译器:
fn find_dark_pixels<I: GenericImageView>(img: &I)
where <I as GenericImageView>::Pixel: std::cmp::PartialEq
(the rest is unchanged)
然后它提示闭包中的“像素”和“白色”的类型不匹配:
mismatched types
expected associated type `<I as GenericImageView>::Pixel`
found struct `Luma<u8>`
consider constraining the associated type `<I as GenericImageView>::Pixel` to `Luma<u8>`
for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html rustc(E0308)
我遵循(我相信?)编译器的建议并将函数签名更改为:
fn find_dark_pixels<I: GenericImageView>(img: &I)
where <I as GenericImageView>::Pixel: Luma<u8>
(the rest is unchanged)
编译器计数器:
expected trait, found struct `Luma`
not a trait rustc(E0404)
在这一点上,我尝试以各种方式注释“像素”和“白色”,但我认为自己被难住了。你知道,我也知道,Luma 实现了比较所需的一切 pixel != WHITE ,但我不知道如何说服 rustc。
(如果有帮助,该函数只适用于 ImageBuffers 类型的 Luma<u8>, Vec<u8> - 我只需要使用单色图像。但它确实需要使用任何(不可变的) ImageView 。)

最佳答案

编译器关于“将关联类型 <T as Trait>::Associated 限制为 Concrete”的建议意味着您需要直接在 trait bound 中为关联类型请求具体类型。这是通过 Trait<Associated = Concrete> 完成的。语法 - 例如约束 I对于产生字符串的迭代器,你可以写 I: Iterator<Item = String> .在 find_dark_pixels 的情况下你会要求 Pixel关联类型为 Luma<u8>如下:

fn find_dark_pixels<I: GenericImageView<Pixel = Luma<u8>>>(img: &I) {

关于generics - 使此函数通用时如何满足特征界限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65674750/

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