如何重置所有数组元素?

时间:2018-03-09 10:57:19

标签: arrays rust

这是我提出的最短内容,经过广泛的谷歌搜索和研究来源:

let mut buf = [0u8; 200];
for elem in buf.iter_mut() {
    *elem = 0;
}

真的没有办法让它成为单行,例如buf.set_all(0)

3 个答案:

答案 0 :(得分:3)

  

真的没有办法让它成为单行,例如buf.set_all(0)

当然你可以把它变成单线......

for elem in buf.iter_mut() { *elem = 0; }

好的,好的......如果你这么做了,你可以定义一个提供set_all方法的扩展特性。

trait SetAll {
    type Elem;
    fn set_all(&mut self, value: Self::Elem);
}

impl<T> SetAll for [T] where T: Clone {
    type Elem = T;
    fn set_all(&mut self, value: T) {
        for e in self {
            *e = value.clone();
        }
    }
}

但就 而言,使用标准库中的内容时,有for_each(如Sven Marnach所述):

buf.iter_mut().for_each(|x| *x = 0)

答案 1 :(得分:2)

您可以简单地构造一个新数组并将其移动到您想要更改的数组中。

buf = [0u8; 200];

如果编译器很好,它可以优化临时数组并直接写入目标。

答案 2 :(得分:0)

在您的场景中,这是我的解决方案:

let mut buf = [1u8; 200];
unsafe {
    std::ptr::write_volatile(&mut buf, [0u8;200]);
}

真的没有办法像buf.set_all(0)那样将它变成单线吗?

,您也可以这样做:

struct Buf([u8;200]);
impl Buf {
    fn clear(&mut self) {
        unsafe {
            std::ptr::write_volatile(&mut self.0, [0u8;200]);
        }
    }
}

fn main() {
    let mut buf1 = Buf([1u8; 200]);
    let mut buf2 = Buf([2u8; 200]);
    buf1.clear();
    buf2.clear();
    println!("{}, {}", buf1.0[199], buf2.0[0]);
}