我正在尝试替换所有长度为 8 的切片,如果它们与特定的
[_; 8]
(source_steam_id
) 匹配,则替换为具有相同大小的另一个数组 (target_steam_id
) 的内容。我正在使用 windows(8)
来迭代它的父集合,但似乎编译器不理解我试图一次获取 8 个项目并且大小在编译时是已知的。
#[derive(Clone)]
struct Character {
save_data: Vec<u8>,
}
fn main() {
// setup
let source_character = Character {
save_data: vec![3, 27, 22, 1, 1, 1, 1, 1, 1, 1, 1, 99, 27],
};
// Replace steam id in the result Character
// with the steam id of the target Character
// in the target Character save_data
let mut result_character = source_character.clone();
let source_steam_id: [u8; 8] = [1; 8];
let target_steam_id: [u8; 8] = [2; 8];
result_character.save_data = result_character
.save_data
.windows(8) // id is an [u8; 8]
.map(|w| {
if w[..] == source_steam_id[..] {
target_steam_id[..]
} else {
w[..]
}
})
.collect();
dbg!(&result_character.save_data);
}
编译器说
特性
没有为Sized
实现[u8]
在
map(|w|
。我怎样才能避免这种情况?
可以通过简单地引用或使用
as_slice
:来避免错误
&w[..] == source_steam_id.as_slice()
但是在窗口上映射不会让你最终重建整个
Vec
。
相反,假设您只想替换一次出现,您可以使用 position
找到它并使用 copy_from_slice
:
const ID_NUM_BYTES: usize = 8;
let pos = result_character
.save_data
.windows(ID_NUM_BYTES)
.position(|w| &w[..] == source_steam_id.as_slice()).unwrap();
result_character.save_data[pos..pos+8].copy_from_slice(&target_steam_id);
这有一个额外的好处,即只需写入更改的 8 个字节,而不是整个向量。