Rust タプルと配列

### タプル
タプルは複数の異なる型の値を1つのグループにすることができる複合型
let t1 = (12, 24);
let t2 = (50, 0.8, 12);
let t3 = (23.0, “Hello”, 88, ‘あ’);

タプルの長さは一旦決定すると変更できない。個々の要素はピリオド(.)を使ってアクセスする

fn main(){
	let t1: (i32, f64, u8) = (50, 0.8, 12);
	let t2 = (123, 2.3, 10);
	println!("{} {} {}", t1.0, t2.1, t1.2);
	println!("{} {} {}", t2.0, t2.1, t2.2);
}

タプルから新しいタプルを作ることもできる

fn main(){
	let t2 = (123, 2.3, 10);
	let (x, y, z) = t2;
	println!("{} {} {}", x, y, z);
}

複合型の値は{:?}を指定することで全体を出力することができる

fn main(){
	let t: (i32, f64, u8) = (50, 0.8, 12);
	println!("{:?}", t);
}

mutを使って宣言したタプルの中に保存した値は、同じデータ型であれば変更できる

fn main(){
	let mut t = (12, 24);
	println!("{:?}", t);

	t.0 = 23;
	println!("{:?}", t);
}

変数を使ってタプルの要素にアクセスすることはできない

### 配列
配列(array)は同じ型の要素を並べたもの。長さは変えることができない
let a = [1, 2, 3, 4, 5];
let a: [i32; 5] = [1, 2, 3, 4, 5];
let a = [3; 5];
let mut data = [0 as u8; 6] // 6バイトのu8型配列

fn main(){
	let mut data = [0 as u8; 6];

	data[1] = 12;
	data[3] = 34;
	data[5] = 56;

	println!("data={:?}", data);
}

実行時にならないとアクセスする要素のインデックスが決定しない場合は、コンパイル時にはエラーとして検出されず、実行時にパニックが発生する

forでrangeの代わりに配列のイテレータを指定することもできる

fn main(){
	let a = [1, 3, 5, 7, 9];
	for i in a.iter(){
		println!("{}の2乗は{}", i, i*i);
	}
}

for文のrangeに配列の要素数を指定して繰り返しても構わない

fn main(){
	const NDATA:usize = 5;
	let mut data = [0; NDATA];
	for i in 0..NDATA {
		data[i] = i;
	}
	println!("{:?}", data);
}