Cでは、int foo[100] = { 7, 8 };
と書くことができ、[7, 8, 0, 0, 0...]
となります。Rustの明示的な部分配列の初期化
これにより、配列の先頭に隣接する要素のグループの初期値を明示的かつ簡潔に選択することができ、残りは静的な記憶期間(つまり、適切な型のゼロ値)があるかのように初期化されます)。
錆に相当するものはありますか?
Cでは、int foo[100] = { 7, 8 };
と書くことができ、[7, 8, 0, 0, 0...]
となります。Rustの明示的な部分配列の初期化
これにより、配列の先頭に隣接する要素のグループの初期値を明示的かつ簡潔に選択することができ、残りは静的な記憶期間(つまり、適切な型のゼロ値)があるかのように初期化されます)。
錆に相当するものはありますか?
私の知る限り、このようなショートカットはありません。しかし、いくつかの選択肢があります。アレイを初期化する
直接構文
直接構文はCopy
タイプ(整数Copy
ある)と連動:
let array = [0; 1024];
はすべて0 1024個の要素の配列を初期化します。
これに基づいて、その後の配列を変更することができる:
let array = {
let mut array = [0; 1024];
array[0] = 7;
array[1] = 8;
array
};
注コードの小さな部分に可変性を単離するために、ブロック式を使用してのトリック。私たちはそれを下に再利用します。
イテレータの構文
もあり、イテレータから配列を初期化するためにサポートしています。
let array = {
let mut array = [0; 1024];
for (i, element) in array.iter_mut().enumerate().take(2) {
*element = (i + 7);
}
array
};
あなたも(オプション)を使用して、初期化されていない状態から開始することができますunsafe
ブロック:
let array = unsafe {
// Create an uninitialized array.
let mut array: [i32; 10] = mem::uninitialized();
let nonzero = 2;
for (i, element) in array.iter_mut().enumerate().take(nonzero) {
// Overwrite `element` without running the destructor of the old value.
ptr::write(element, i + 7)
}
for element in array.iter_mut().skip(nonzero) {
// Overwrite `element` without running the destructor of the old value.
ptr::write(element, 0)
}
array
};
短いイテレータの構文
clone_from_slice
に基づく短い形式は、ありますが、それはしかし、現在、不安定です。ここで
#![feature(clone_from_slice)]
let array = {
let mut array = [0; 32];
// Override beginning of array
array.clone_from_slice(&[7, 8]);
array
};
はマクロです
macro_rules! array {
($($v:expr),*) => (
{
let mut array = Default::default();
{
let mut e = <_ as ::std::convert::AsMut<[_]>>::as_mut(&mut array).iter_mut();
$(*e.next().unwrap() = $v);*;
}
array
}
)
}
fn main() {
let a: [usize; 5] = array!(7, 8);
assert_eq!([7, 8, 0, 0, 0], a);
}