这是我在广泛的谷歌搜索和研究来源后得出的最短的:
let mut buf = [0u8; 200]; for elem in buf.iter_mut() { *elem = 0; }
真的没有办法让它成为一行程序吗,比如buf.set_all(0)?
buf.set_all(0)
wgeznvg71#
真的没有办法让它成为一行程序吗,比如buf.set_all(0)?当然你可以把它变成一句俏皮话...
for elem in buf.iter_mut() { *elem = 0; }
好吧,好吧...如果你经常这样做,你可以定义一个提供set_all方法的扩展trait。
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所指出的那样):
for_each
buf.iter_mut().for_each(|x| *x = 0)
mrzz3bfm2#
您可以简单地构造一个新数组并将其移动到您想要更改的数组中。
buf = [0u8; 200];
如果编译器很好,它可以优化临时数组并直接写入目标。
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]); }
zsohkypk4#
更新:slice::fill方法从1.50开始稳定。
slice::fill
4条答案
按热度按时间wgeznvg71#
真的没有办法让它成为一行程序吗,比如
buf.set_all(0)
?当然你可以把它变成一句俏皮话...
好吧,好吧...如果你经常这样做,你可以定义一个提供
set_all
方法的扩展trait。但是就 * 只是 * 使用标准库中的内容而言,有
for_each
(正如Sven Marnach所指出的那样):mrzz3bfm2#
您可以简单地构造一个新数组并将其移动到您想要更改的数组中。
如果编译器很好,它可以优化临时数组并直接写入目标。
i7uaboj43#
在您场景中,这是我的解决方案:
真的没有办法让它成为一行程序吗,比如buf.setall(0)?
你也可以这样做
zsohkypk4#
更新:
slice::fill
方法从1.50开始稳定。