这是我提出的最短内容,经过广泛的谷歌搜索和研究来源:
let mut buf = [0u8; 200];
for elem in buf.iter_mut() {
*elem = 0;
}
真的没有办法让它成为单行,例如buf.set_all(0)
?
答案 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]);
}