今日の内容
- 配列
はじめに
前回はシーザー暗号を通してRustについてより詳しく学びました。今日は、Rustでの配列について詳しく学んでいこうと思います。
配列
配列とは、固定サイズの要素を同じ型で格納するデータ構造です。
以下のように宣言します。
let 配列名 = [要素, 要素, 要素,..];
注意すべき点は、配列の長さは 変えることができません。
定義した時点で配列の長さは固定されます。
例えば、
let a = [1, 2, 3];
であれば、配列aの長さは3です。これに要素を追加したり、削除したりすることはできません。とても不便なので、ほとんど配列を使うことはないでしょう。その代わりにRustでは スライス という機能があります。今日はこの機能には触れませんが、長さが可変です。
配列の要素数を変えることはできませんが、要素自体にアクセスして、いじることはできます。
fn main(){
let numbers = [10, 20, 30, 40, 50];
println!("1番目の要素: {}", numbers[0]);
println!("配列の長さ: {}", numbers.len());
}
/******** 実行結果 ********
1番目の要素: 10
配列の長さ: 5
************************/
このプログラムは、配列numbersの一つ目の要素と、配列numbersの長さを取得し、表示させています。
配列の要素は以下のように取得します。
配列名[要素番号]
要素番号は0,1,2,..です。
配列の長さは、以下のように取得します。
配列名.len()
また、Rustでは他の配列の定義方法があります。
let 配列名 = [値; 配列要素数]
これは、「配列要素数」分、「値」で埋まった配列が作れます。
配列の要素をいじるには、配列自体を可変にする必要がありますが、これは今まで通り「mut」を配列名の手前につけるだけでよいです。
以下は、「0」で「10個」埋められた配列を、順番に0~9で置き換えるプログラムです。
fn main(){
let mut a = [0; 10];
for i in 0..a.len() {
a[i] = i;
}
}
表示を追加すれば、0~9に置き換えられていることがわかります。
また、配列とforの間にはおもしろい機能が用意されています。
以下のプログラムを実行してみてください。
fn main(){
let a = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
for i in a {
println!("{}", i);
}
}
/******** 実行結果 ********
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec
************************/
さて、プログラム内では配列の個々の要素にアクセスしてるようには見えないのに、実行結果を見てみると、順番に表示されていることがわかります。さらに、for文の形が見慣れない方もいるかもしれません。
for 変数 in 配列名 {
}
のようにすることで、変数に配列の要素一つずつが入って繰り返されるようになります。
これについて調べていたらこんな使い方できないらしいので少し困惑しています。イテレーターにしたらできるとかなんとか。
文字列にString型と&str型の二つがありますが、これは大雑把に,String型はスライスで、&strは配列です。つまり、String型は可変長ですが、&strは不変長です。
fn main(){
let s = "abcdefg";
}
これは&str型です。
fn main(){
let s = String::from("abcdefg");
}
これはString型です。
おわりに
え?!もうおわり?!
すみません。昨日からついさっきまで「The Rust Programming Language 日本語版」を爆速で読んでたのですが、ここがいまだにこんがらがっていて、他にいろいろ説明したいことあったはずなのにもう疲れてしまいました..(´;ω;`)。次回は入力について学んでいきます。また、めんどくさいところを..自分のバカ。
ご精読ありがとうございました。
追記
ここからは投降後の追記です。
fn main(){
let a = [0,1,2,3,4,5,6,7,8,9];
for i in a {
println!("{}", i);
}
}
これは、配列aを順番に表示するプログラムです。
fn main (){
let a = [0,1,2,3,4,5,6,7,8,9];
for i in (0..a.len()).rev(){
println!("{}", i);
}
}
これは、配列aの順番を逆から表示するプログラムです。
9
8
7...となります。
「0..a.len()」の部分で、「0から配列aの長さ-1まで繰り返すと」なります。それ自体を、「.rev()」でひっくり返しているので、順番を逆にできます。
fn main (){
let a = [0,1,2,3,4,5,6,7,8,9];
for i in (0..a.len()).step_by(2){
println!("{}", i);
}
}
これは、1番目を入れて、2番目を飛ばし、3番目を入れて、4番目は飛ばし、...となります。つまり実行結果は
0
2
4
6
8
となります。
「.step_by()」は、()内の数分を取得し、そのうちの一個目のみを返します。