如何将u32与可以取负值的动态整型求和?



我是Rust新手,请帮助我。

我正在看Rust和WebAssembly的书。在«添加交互性»一章中有一些练习。其中之一是通过按下Shift键点击cell插入脉冲星。为了插入脉冲星,我创建了这个函数:

pub fn insert_pulsar(&mut self, row: u32, column: u32) {
fn get_pulsar_sector(row: u32, column: u32, x: i32, y: i32) -> Vec<(u32, u32)> {
let vec = vec![
(row + (1 * y), column + (2 * x)), 
(row + (1 * y), column + (3 * x)), 
(row + (1 * y), column + (4 * x)), 
(row + (6 * y), column + (2 * x)),  
(row + (6 * y), column + (3 * x)),  
(row + (6 * y), column + (4 * x)),  
(row + (2 * y), column + (1 * x)), 
(row + (3 * y), column + (1 * x)), 
(row + (4 * y), column + (1 * x)),
(row + (2 * y), column + (6 * x)),  
(row + (3 * y), column + (6 * x)),  
(row + (4 * y), column + (6 * x)),  
];
vec
}
let top_left_pulsar_sector = get_pulsar_sector(row, column, -1, -1);
let top_right_pulsar_sector = get_pulsar_sector(row, column, 1, -1);
let bottom_right_pulsar_sector = get_pulsar_sector(row, column, 1, 1);
let bottom_right_pulsar_sector = get_pulsar_sector(row, column, -1, 1);
let pulsar = [
top_left_pulsar_sector, 
top_right_pulsar_sector, 
bottom_right_pulsar_sector, 
bottom_right_pulsar_sector
].concat();
self.set_cells(&pulsar);
}

但是当我试图编译我的项目时,我得到这样的错误:

error[E0277]: cannot add `i32` to `u32`
--> src/lib.rs:197:40
|
197 |                 (row + (4 * y), column + (6 * x)),  
|                                        ^ no implementation for `u32 + i32`
|
= help: the trait `Add<i32>` is not implemented for `u32`

可以看到,x和y用来设置脉冲星扇形的位置。我能对get_pulsar_sector函数代码做些什么来使其工作?

您可以使用as将负值转换为unsigned。在我的例子中,我做到了:

pub fn insert_pulsar(&mut self, row: u32, column: u32) {
fn get_pulsar_sector(row: u32, column: u32, x: isize, y: isize) -> Vec<(u32, u32)> {
let vec = vec![
(row + (1 * y) as u32, column + (2 * x) as u32), 
(row + (1 * y) as u32, column + (3 * x) as u32), 
(row + (1 * y) as u32, column + (4 * x) as u32), 
(row + (6 * y) as u32, column + (2 * x) as u32),  
(row + (6 * y) as u32, column + (3 * x) as u32),  
(row + (6 * y) as u32, column + (4 * x) as u32),  
(row + (2 * y) as u32, column + (1 * x) as u32), 
(row + (3 * y) as u32, column + (1 * x) as u32), 
(row + (4 * y) as u32, column + (1 * x) as u32),
(row + (2 * y) as u32, column + (6 * x) as u32),  
(row + (3 * y) as u32, column + (6 * x) as u32),  
(row + (4 * y) as u32, column + (6 * x) as u32),  
];
vec
}
let top_left_pulsar_sector = get_pulsar_sector(row, column, -1, -1);
let top_right_pulsar_sector = get_pulsar_sector(row, column, 1, -1);
let bottom_right_pulsar_sector = get_pulsar_sector(row, column, 1, 1);
let bottom_left_pulsar_sector = get_pulsar_sector(row, column, -1, 1);
let pulsar = [
&top_left_pulsar_sector[..], 
&top_right_pulsar_sector[..], 
&bottom_right_pulsar_sector[..], 
&bottom_left_pulsar_sector[..],
].concat();
self.set_cells(&pulsar);
}

并编译。

感谢@ masklin !

最新更新