Rustのスカラー型と複合データ型
Rustにはスカラー型と複合データ型とその他の3種類のデータ型が存在します。
スカラー型
スカラー型は単一の値を持つ基本的なデータ型です。
整数型(Integers)
- 符号付き整数(
i8
,i16
,i32
,i64
,i128
,isize
) - 符号なし整数(
u8
,u16
,u32
,u64
,u128
,usize
)
let x: i32 = 42;
let y: u8 = 255;
浮動小数点型(Floating-Point Numbers)
- f32(単精度浮動小数点数)
- f64(倍精度浮動小数点数)
let x: f32 = 3.14;
let y: f64 = 2.718281828459045;
論理型(Booleans)
bool(trueまたはfalseの値を取る)
let is_active: bool = true;
let is_admin: bool = false;
文字型(Characters)
char(Unicodeのスカラ値を表す。1つの文字は4バイトで表現される)
let letter: char = 'A';
let emoji: char = '😊';
複合データ型
複合データ型は複数の値をまとめて扱うデータ型です。
タプル(Tuples)
異なる型の値をまとめて1つのグループとして扱う
let tup: (i32, f64, char) = (500, 6.4, 'Z');
let (x, y, z) = tup;
println!("The value of y is: {}", y);
配列(Arrays)
同じ型の値を固定長でまとめて扱う
let a: [i32; 3] = [1, 2, 3];
let first = a[0];
let second = a[1];
ベクター(Vectors)
同じ型の値を可変長でまとめて扱う(標準ライブラリのVec型を使用)
let mut v: Vec<i32> = Vec::new();
v.push(1);
v.push(2);
v.push(3);
println!("The second element is: {}", v[1]);
構造体(Structs)
複数の関連する値をひとつのグループにまとめて表現する
struct Person {
name: String,
age: u8,
}
let person = Person {
name: String::from("Alice"),
age: 30,
};
println!("{} is {} years old", person.name, person.age);
列挙型(Enums)
特定の値の集合を定義し、それらの値を1つの型として表現する
enum IpAddrKind {
V4,
V6,
}
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;
その他のデータ型
その他の型は標準ライブラリで提供されるデータ型や、より複雑なデータ型を含みます。
文字列型(String Types)
Rustには主に2種類の文字列型があります。
文字列スライス(String Slices): &str
let s: &str = "Hello, world!";
String: 可変で所有権を持つ文字列型
let mut s: String = String::from("Hello");
s.push_str(", world!");
オプション型(Option Type)
オプション型は値が存在するかどうかを表現します。
値が存在する場合はSome、存在しない場合はNoneを使用します。
let some_number: Option<i32> = Some(5);
let absent_number: Option<i32> = None;
結果型(Result Type)
結果型は操作が成功したか失敗したかを表現します。成功の場合はOk、失敗の場合はErrを使用します。
use std::fs::File;
use std::io::ErrorKind;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
Err(error) => match error.kind() {
ErrorKind::NotFound => match File::create("hello.txt") {
Ok(fc) => fc,
Err(e) => panic!("Problem creating the file: {:?}", e),
},
other_error => panic!("Problem opening the file: {:?}", other_error),
},
};
}
型エイリアス(Type Aliases)
型エイリアスは既存の型に別名を付けるための機能です。
type Kilometers = i32;
let x: Kilometers = 5;
ジェネリック(Generics)
ジェネリックは、具体的な型に依存しないコードを記述するための機能です。関数や構造体に対して使用できます。
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}