在函数中使用`draw_filled_circle_mut`:trait bound不满足

时间:2017-05-18 08:05:10

标签: rust

使用imageproc crate,我可以在图片上调用draw_filled_circle_mut

let mut img = ImageBuffer::from_pixel(640, 480, Rgb([255, 0, 0]));
draw_filled_circle_mut(&mut img, (300, 300), 50, Rgb([0, 255, 0]));

但如果我使用一个功能它不起作用:

fn circle(img: &mut RgbImage) {
    draw_filled_circle_mut(&mut img, (300, 300), 50, Rgb([0, 255, 0]));
}

fn main() {
    let mut img = ImageBuffer::from_pixel(640, 480, Rgb([255, 0, 0]));
    circle(&mut img);
}

它返回此错误:

error[E0277]: the trait bound `&mut image::ImageBuffer<image::Rgb<u8>, std::vec::Vec<u8>>: image::GenericImage` is not satisfied
  --> src/main.rs:84:5
   |
84 |     draw_filled_circle_mut(&mut img, (300, 300), 50, Rgb([10,255,10]));
   |     ^^^^^^^^^^^^^^^^^^^^^^ the trait `image::GenericImage` is not implemented for `&mut image::ImageBuffer<image::Rgb<u8>, std::vec::Vec<u8>>`
   |
   = help: the following implementations were found:
         <image::ImageBuffer<P, Container> as image::GenericImage>
   = note: required by `imageproc::drawing::draw_filled_circle_mut`

我仍然因这种错误而迷失方向。我以为我可以使用RgbImage ImageBuffer<Rgb<u8>, Vec<u8>>,这是我的img var(除非我不明白)。

那么为什么它在同一个函数中工作(没有实际写入类型)并且当我使用另一个函数(带有类型参数)时它不起作用?

1 个答案:

答案 0 :(得分:2)

fn circle(img: &mut RgbImage) {
    draw_filled_circle_mut(&mut img, ...

img的类型为&mut RgbImage,然后你会采用另一个可变参考。那是你试图将&mut &mut RgbImage传递给draw_filled_circle_mut,而它期望&mut RgbImage

正确版本

fn circle(img: &mut RgbImage) {
    draw_filled_circle_mut(img, (300, 300), 50, Rgb([0, 255, 0]));
}

错误讯息怎么样?让我们看一下函数的声明

pub fn draw_filled_circle_mut<I>(
    image: &mut I, 
    center: (i32, i32), 
    radius: i32, 
    color: I::Pixel
) 
where
    I: GenericImage,
    I::Pixel: 'static, 

函数需要&mut I作为第一个参数,类型I必须实现特征GenericImage。您将&mut &mut RgbImage传递给该函数,这意味着I&mut RgbImage

编译器检查&mut RgbImage是否实现GenericImage特征,发现它不是,并输出错误消息告诉它。