rust 如何重置所有数组元素?

mu0hgdu0  于 2023-03-23  发布在  其他
关注(0)|答案(4)|浏览(165)

这是我在广泛的谷歌搜索和研究来源后得出的最短的:

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

真的没有办法让它成为一行程序吗,比如buf.set_all(0)

wgeznvg7

wgeznvg71#

真的没有办法让它成为一行程序吗,比如buf.set_all(0)
当然你可以把它变成一句俏皮话...

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

好吧,好吧...如果你经常这样做,你可以定义一个提供set_all方法的扩展trait。

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)
mrzz3bfm

mrzz3bfm2#

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

buf = [0u8; 200];

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

i7uaboj4

i7uaboj43#

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

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

真的没有办法让它成为一行程序吗,比如buf.setall(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]);
}
zsohkypk

zsohkypk4#

更新:slice::fill方法从1.50开始稳定。

相关问题