Rust-array

提供:Dev Guides
移動先:案内検索

錆-配列

この章では、配列とそれに関連するさまざまな機能について学習します。 配列について学ぶ前に、配列が変数とどのように異なるかを見てみましょう。

変数には次の制限があります-

  • 変数は本質的にスカラーです。 つまり、変数宣言には一度に1つの値しか含めることができません。 つまり、プログラムにn個の値を保存するには、n個の変数宣言が必要になります。 したがって、値のより大きなコレクションを格納する必要がある場合、変数の使用は実行できません。
  • プログラム内の変数には、ランダムな順序でメモリが割り当てられるため、宣言の順序で値を取得または読み取ることが難しくなります。

配列は、値の同種のコレクションです。 簡単に言えば、配列は同じデータ型の値のコレクションです。

配列の機能

配列の機能は以下のとおりです-

  • 配列宣言は、シーケンシャルメモリブロックを割り当てます。
  • 配列は静的です。 これは、一度初期化された配列のサイズを変更できないことを意味します。
  • 各メモリブロックは配列要素を表します。
  • 配列要素は、要素の添字/インデックスと呼ばれる一意の整数によって識別されます。
  • 配列要素の入力は、配列の初期化と呼ばれます。
  • 配列要素の値は更新または変更できますが、削除することはできません。

配列の宣言と初期化

以下に示す構文を使用して、Rustで配列を宣言および初期化します。

構文

//Syntax1
let variable_name = [value1,value2,value3];

//Syntax2
let variable_name:[dataType;size] = [value1,value2,value3];

//Syntax3
let variable_name:[dataType;size] = [default_value_for_elements,size];

最初の構文では、配列の型は、初期化中に配列の最初の要素のデータ型から推測されます。

図:単純な配列

次の例では、配列のサイズとデータ型を明示的に指定しています。 println!()関数の \ {:?}構文は、配列内のすべての値を出力するために使用されます。 _len()_関数は、配列のサイズを計算するために使用されます。

fn main(){
   let arr:[i32;4] = [10,20,30,40];
   println!("array is {:?}",arr);
   println!("array size is :{}",arr.len());
}

出力

array is [10, 20, 30, 40]
array size is :4

図:データ型のない配列

次のプログラムは、4つの要素の配列を宣言しています。 データ型は、変数宣言中に明示的に指定されていません。 この場合、配列は整数型になります。 _len()_関数は、配列のサイズを計算するために使用されます。

fn main(){
   let arr = [10,20,30,40];
   println!("array is {:?}",arr);
   println!("array size is :{}",arr.len());
}

出力

array is [10, 20, 30, 40]
array size is :4

図:デフォルト値

次の例では、配列を作成し、そのすべての要素をデフォルト値_-1_で初期化します。

fn main() {
   let arr:[i32;4] = [-1;4];
   println!("array is {:?}",arr);
   println!("array size is :{}",arr.len());
}

出力

array is [-1, -1, -1, -1]
array size is :4

図:forループのある配列

次の例では、配列を反復処理し、インデックスとそれに対応する値を出力します。 ループは、インデックス0〜4(最後の配列要素のインデックス)から値を取得します。

fn main(){
   let arr:[i32;4] = [10,20,30,40];
   println!("array is {:?}",arr);
   println!("array size is :{}",arr.len());

   for index in 0..4 {
      println!("index is: {} & value is : {}",index,arr[index]);
   }
}

出力

array is [10, 20, 30, 40]
array size is :4
index is: 0 & value is : 10
index is: 1 & value is : 20
index is: 2 & value is : 30
index is: 3 & value is : 40

図:iter()関数の使用

iter()関数は、配列内のすべての要素の値を取得します。

fn main(){

let arr:[i32;4] = [10,20,30,40];
   println!("array is {:?}",arr);
   println!("array size is :{}",arr.len());

   for val in arr.iter(){
      println!("value is :{}",val);
   }
}

出力

array is [10, 20, 30, 40]
array size is :4
value is :10
value is :20
value is :30
value is :40

図:可変配列

_mut_キーワードを使用して、可変配列を宣言できます。 次の例では、可変配列を宣言し、2番目の配列要素の値を変更します。

fn main(){
   let mut arr:[i32;4] = [10,20,30,40];
   arr[1] = 0;
   println!("{:?}",arr);
}

出力

[10, 0, 30, 40]

関数へのパラメーターとしての配列の受け渡し

配列は、値または関数への参照によって渡すことができます。

イラスト:値渡し

fn main() {
   let arr = [10,20,30];
   update(arr);

   print!("Inside main {:?}",arr);
}
fn update(mut arr:[i32;3]){
   for i in 0..3 {
      arr[i] = 0;
   }
   println!("Inside update {:?}",arr);
}

出力

Inside update [0, 0, 0]
Inside main [10, 20, 30]

イラスト:参照渡し

fn main() {
   let mut arr = [10,20,30];
   update(&mut arr);
   print!("Inside main {:?}",arr);
}
fn update(arr:&mut [i32;3]){
   for i in 0..3 {
      arr[i] = 0;
   }
   println!("Inside update {:?}",arr);
}

出力

Inside update [0, 0, 0]
Inside main [0, 0, 0]

配列宣言と定数

配列の宣言と定数を理解するために、以下の例を考えてみましょう。

fn main() {
   let N: usize = 20;
   let arr = [0; N];//Error: non-constant used with constant
   print!("{}",arr[10])
}

コンパイラーは例外になります。 これは、コンパイル時に配列の長さがわかっている必要があるためです。 ここで、変数「N」の値は実行時に決定されます。 つまり、変数を使用して配列のサイズを定義することはできません。

ただし、次のプログラムは有効です-

fn main() {
   const N: usize = 20;
  //pointer sized
   let arr = [0; N];

   print!("{}",arr[10])
}

constキーワードをプレフィックスとする識別子の値はコンパイル時に定義され、実行時に変更することはできません。 usizeはポインタサイズであるため、実際のサイズはプログラムをコンパイルするアーキテクチャに依存します。