今日の内容
- 変数型
- 型推論
- 型指定
はじめに
前回はフィボナッチ数列を通して変数定義について学びました。今回は、Rustでの型について学びます。
型
Rustは静的型付き言語です。とはいえ、今まで変数定義に型指定はしてきませんでした。なぜでしょうか?それは、Rustには 型推論 が搭載されているからです。
型推論とは
型推論とは、ソースコード内の変数や式の型を自動的に推論してくれる機能。
今まで変数を定義するときは、
let 変数名 = 値;
のようにしてきました。ここで、C言語での変数定義を思い出してみましょう。
int a = 1;
float b = 1.0;
char c = 'c';
C言語では、変数を定義するときに、その変数の型を指定する必要がありました。しかし、以前にRustは型に厳格であるといいました。
ここで疑問に思うのは、なぜ型に厳格なのに、C言語のように型を明確に示す必要がないのか、ということです。その理由は、見比べてみたらわかりやすいですが、可読性によるものです。
let a = 1;
let b = 1.0;
let c = 'c';
let d = "RUST VS C";
int a = 1;
float b = 1.0;
char c = 'c';
char d[10] = "RUST VS C\0";
確かにRustでの変数定義のほうが揃っていて見やすいですね。しかし、本当にそれだけが理由でしょうか?実は、型推論のほうが、むしろ安全性が高いのです。型推論では、推論に失敗するとその時点でエラーを出してくれるので、エラーの早期発見ができるのです。
型指定の必要性
ここまで、型推論のすごさを感じてきました。では、型指定は必要あるのでしょうか?
実は、型推論が有効なのは「関数の内側」 だけなのです。そのため、関数の定義や、より発展的なデータ型を使ったりする場合には、型の定義が必須になります。
数値型
Rustにおける数値には、大きく分けて「符号付整数」、「符号なし整数」、「浮動小数点数」の三種類になります。
符号付整数
型 | 説明 |
---|---|
i8 | 8ビット整数(-128から127) |
i16 | 16ビット整数(-32768から32767) |
i32 | 32ビット整数(-2147483648から2147483647) |
i64 | 64ビット整数(-9223372036854775808から9223372036854775807) |
i128 | 128ビット整数(-2¹²⁷から2¹²⁷-1) |
isize | ポインタサイズ整数型(コンピュータ依存。64bitとか32bitとか。) |
符号なし整数
型 | 説明 |
---|---|
u8 | 8ビット整数(0から255) |
u16 | 16ビット整数(0から65535) |
u32 | 32ビット整数(0から4294967295) |
u64 | 64ビット整数(0から18446744073709551615) |
u128 | 128ビット整数(0から2¹²⁸-1) |
usize | ポインタサイズ符号なし整数型(コンピュータ依存。64bitとか32bitとか。) |
浮動小数点数型
型 | 説明 |
---|---|
f32 | 32ビット浮動小数点数(実数) |
f64 | 64ビット浮動小数点数(実数) |
型の範囲を知る方法
型の範囲は「i8::MIN」や「i8::MAX」で取得できます。
つまり、次のようにすることで、わざわざ検索しなくても確認することができます。
fn main(){
println!("-------- 符号なし整数 --------");
println!("i8: {}~{}", i8::MIN, i8::MAX);
println!("i16: {}~{}", i16::MIN, i16::MAX);
println!("i32: {}~{}", i32::MIN, i32::MAX);
println!("i64: {}~{}", i64::MIN, i64::MAX);
println!("i128: {}~{}", i128::MIN, i128::MAX);
println!("-------- 符号付き整数 --------");
println!("u8: {}~{}", u8::MIN, u8::MAX);
println!("u16: {}~{}", u16::MIN, u16::MAX);
println!("u32: {}~{}", u32::MIN, u32::MAX);
println!("u64: {}~{}", u64::MIN, u64::MAX);
println!("u128: {}~{}", u128::MIN, u128::MAX);
}
/******** 出力結果 *******
-------- 符号なし整数 --------
i8: -128~127
i16: -32768~32767
i32: -2147483648~2147483647
i64: -9223372036854775808~9223372036854775807
i128: -170141183460469231731687303715884105728~170141183460469231731687303715884105727
-------- 符号付き整数 --------
u8: 0~255
u16: 0~65535
u32: 0~4294967295
u64: 0~18446744073709551615
u128: 0~340282366920938463463374607431768211455
*************************/
型指定
変数宣言の際、型推論を使わずに自分で型を指定するには、以下のように記述します。
let 変数名: 型名 = 値;
Rustでは、計算をする際に必ず値同士が、同じ型である必要があります。
おわりに
おつかれさまでした。今回は、100DaysOfCode 六日目として、変数の「型」ついて学びました。次回はシーザー暗号を解いて、もう少しRustについて詳しく学んでいきます。
ご精読、ありがとうございました。