在Rust中将切片内容转储到数组的惯用方法?

cbeh67ev  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(272)

我正在做这样的事情:

type HashId = [u8; 32];

fn fill_hash_id(hash_id: &mut HashId, hash_data: &[u8]) {
    for i in 0..32 {
        hash_id[i] = hash_data[i];
    }
    ()
}

在《 rust 》中,有没有更好、更直接或更地道的方式来表达这一点?

ovfsdjhp

ovfsdjhp1#

要将问题的注解扩展为完整答案:
slice方法copy_from_slice将起作用。
因为数组[T; N]实作AsMut<[T]> *(也就是说,对T的可变数组的指涉可以视为T的可变 slice),所以您可以在数组上呼叫这个方法。

type HashId = [u8; 32];

fn main() {
    let mut hash_id: HashId = [0u8; 32];
    let hash_data = vec![1u8; 32];

    hash_id.copy_from_slice(&hash_data);

    println!("{:?}", &hash_id);
    // bunch of '1's
}

但要小心;如果目标和接收器的长度不同,copy_from_slice将出现混乱。

  • 完全披露:[T; N]还实现了BorrowMut<T>,虽然我 * 相当 * 肯定AsMut是这里起作用的特性,但我不能100%肯定它不是BorrowMut

相关问题