为什么在重构此示例代码以在调整大小图像库周围使用包装器时,我会收到不同类型的编译器请求。
基本上调整大小似乎总是u16
输出,那么为什么我的更改要求u8
原始代码从未需要此转换?
extern crate resize;
use resize::Type;
use resize::Pixel;
pub struct Resize{
w1:usize,
h1:usize,
w2:usize,
h2:usize,
src: Vec<u16>,
}
impl Resize {
pub fn new(
ow:usize,
oh:usize,
dw:usize,
dh:usize,
inc: Vec<u16>
) -> Resize {
Resize {
w1:ow,
h1:oh,
w2:dw,
h2:dh,
src:inc,
}
}
pub fn run(&self) -> Vec<u16> {
let mut dst = vec![0;self.w2*self.h2];
resize::resize(
self.w1,
self.h1,
self.w2,
self.h2,
Pixel::RGBA64,
Type::Lanczos3,
self.src.as_slice(),
&mut dst,
);
dst
}
}
编译器错误消息
error[E0308]: mismatched types
--> src/main.rs:24:45
|
24 | let image = Resize::new(w1, h1, w2, h2, src);
| ^^^ expected u16, found u8
|
= note: expected type `std::vec::Vec<u16>`
found type `std::vec::Vec<u8>`
= help: here are some functions which might fulfill your needs:
- .to_vec()
error[E0308]: mismatched types
--> src/main.rs:30:54
|
30 | encoder.write_header().unwrap().write_image_data(dst).unwrap();
| ^^^ expected u8, found u16
|
= note: expected type `&[u8]`
found type `&[u16]`
TL;DR:src
变量的预期类型是Vec<u16>
,但由于类型推断,它被设置为Vec<u8>
。
变量src
在行中分配:
let mut src = vec![0;info.buffer_size()];
它稍后通过调用以下命令推断类型Vec<u8>
:
reader.next_frame(&mut src).unwrap();
或
resize::resize(w1, h1, w2, h2, Gray8, Triangle, &src, &mut dst);
因为这些函数需要类型&mut [u8]
,而不是&mut [u16]
。
如果我们在分配src
时显式设置预期的类型Vec<u16>
:
let mut src: Vec<u16> = vec![0; info.buffer_size()];
现在调用next_frame()
和resize()
将失败,因为类型不匹配,但编译器会给我们更好的提示,说明出了什么问题以及我们可以做些什么。
error[E0308]: mismatched types
--> src/main.rs:65:23
|
65 | reader.next_frame(&mut src).unwrap();
| ^^^^^^^^ expected slice, found struct `std::vec::Vec`
|
= note: expected type `&mut [u8]`
found type `&mut std::vec::Vec<u16>`
= help: here are some functions which might fulfill your needs:
- .as_mut_slice()
error[E0308]: mismatched types
--> src/main.rs:74:53
|
74 | resize::resize(w1, h1, w2, h2, Gray8, Triangle, &src, &mut dst);
| ^^^^ expected slice, found struct `std::vec::Vec`
|
= note: expected type `&[u8]`
found type `&std::vec::Vec<u16>`
= help: here are some functions which might fulfill your needs:
- .as_slice()