如何在迭代其父向量时用相同长度的数组替换一定长度的切片

问题描述 投票:0回答:1

我正在尝试替换所有长度为 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|
。我怎样才能避免这种情况?

rust slice
1个回答
0
投票

可以通过简单地引用或使用

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 个字节,而不是整个向量。

© www.soinside.com 2019 - 2024. All rights reserved.