How to easily copy a non-mut &[u8] into to a &mut [u8]

时间:2015-06-26 10:27:18

标签: copy rust slice mutability

I want to do some manipulations on a &mut [u8].

In my testing code I have:

#[test]
fn test_swap_bytes() {
    let input: &[u8] = b"abcdef";
    let result: &mut[u8] = ?;
    do_something(result);
    assert_eq!(b"fedcba", result);
}

How can I easily get a mutable u8 slice in this case? What should I put on the place of the question mark?

2 个答案:

答案 0 :(得分:9)

您可以使用二进制文字在编译时知道其大小的事实。因此,您可以取消引用它并将其存储在堆栈中。任何let绑定也可以是一个可变的let绑定。

let mut input: [u8; 6] = *b"abcdef";

请参阅PlayPen了解完整的工作示例

请注意,没有理由指定类型,我只是为了清楚起见而展示了它。

答案 1 :(得分:6)

我会使用to_owned()

#[test]
fn test_swap_bytes() {
    let input: &[u8] = b"abcdef";
    let result: &mut[u8] = &mut input.to_owned();
    do_something(result);
    assert_eq!(b"fedcba", result);
}

显然这会创建一个副本(通过中间Vec),因为输入是不可变的。