Rust如何将u32类型与可取值为负的动态int类型相加?
代码修改方案
你遇到的是Rust严格的整数类型检查报错:无符号u32和有符号i32不允许直接运算。修改逻辑很简单:先把行号、列号转成i32完成带偏移的计算,再转回u32即可。同时你原有代码存在变量名重复的笔误,会导致生成的pulsar图案缺失左下扇区,需要一并修正。
修改后的完整代码
pub fn insert_pulsar(&mut self, row: u32, column: u32) { // 可选:添加断言避免点击位置太靠近边界导致坐标为负溢出 debug_assert!(row >= 6 && column >= 6, "pulsar中心位置不能太靠近边界"); fn get_pulsar_sector(row: u32, column: u32, x: i32, y: i32) -> Vec<(u32, u32)> { // 先转成i32再做偏移计算 let row_i = row as i32; let col_i = column as i32; vec![ ((row_i + 1 * y) as u32, (col_i + 2 * x) as u32), ((row_i + 1 * y) as u32, (col_i + 3 * x) as u32), ((row_i + 1 * y) as u32, (col_i + 4 * x) as u32), ((row_i + 6 * y) as u32, (col_i + 2 * x) as u32), ((row_i + 6 * y) as u32, (col_i + 3 * x) as u32), ((row_i + 6 * y) as u32, (col_i + 4 * x) as u32), ((row_i + 2 * y) as u32, (col_i + 1 * x) as u32), ((row_i + 3 * y) as u32, (col_i + 1 * x) as u32), ((row_i + 4 * y) as u32, (col_i + 1 * x) as u32), ((row_i + 2 * y) as u32, (col_i + 6 * x) as u32), ((row_i + 3 * y) as u32, (col_i + 6 * x) as u32), ((row_i + 4 * y) as u32, (col_i + 6 * x) as u32), ] } 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); // 修正变量名重复的笔误,原来两次定义了bottom_right_pulsar_sector 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); }
说明
debug_assert!只会在开发模式下触发检查,帮助你提前发现点击位置太靠近边界的问题,不会影响发布版本的性能- 类型转换的逻辑只在扇区计算函数内完成,不需要修改函数的输入输出签名,也不影响外层其他调用逻辑
内容的提问来源于stack exchange,提问作者reshnaut
相关产品推荐
相关产品推荐

