MENU

【Rust】データ型の扱いを理解しよう!

この記事を読むのに必要な時間は約 9 分です。

引き続きRustの基礎文法、備忘録になります。
今回扱うのはデータ型。基本的な部分ですが静的型付けの特徴をしっかり理解しましょう。

扱う単元はこちら😻

今回も張り切っていきましょう!

目次

Rustにおけるデータ型

Rust は静的型付き言語、つまりコンパイル時にすべての変数の型が判明している必要があります。

コンパイラは通常値と使用方法に基づいて使用したい型を推論しますが、複数の型を取りうる場合は型注釈をつける必要があります。

下の例ではparseメソッドがString型から数値型に変更しようとしていますね。

文字列から数値型に変わるためu32,i64 等さまざまな型を取り得るため、ここではu32 の指定をしています。

let guess: u32 = "42".parse().expect("Not a number!");  

ここで型注釈 :u32 をつけないと下記のようなエラーが起きます。

error[E0282]: type annotations needed
              (型注釈が必要です)
 --> src/main.rs:2:9
  |
2 |     let guess = "42".parse().expect("Not a number!");
  |         ^^^^^ cannot infer type for `_`
  |               (`_`の型が推論できません)
  |
  = note: type annotations or generic parameter binding required
    (注釈: 型注釈、またはジェネリクス引数束縛が必要です)

データ型は大きく分けてスカラー型と複合型があります。順番に見ていきましょう!

スカラー型

Rustには整数、浮動小数点数、論理値、文字の4つのスカラー型があります。

ここはさくっと紹介してこうと思います。

整数型

8,16,32,64bit の方にそれぞれ符号付きと符号なしがあります。

https://doc.rust-jp.rs/book-ja/ch03-02-data-types.html より引用

例えば、各符号付き変数は、-(2n – 1) から 2n – 1 – 1 の間の値を取ります。ここでn はこの変数が使用するビット数です。つまりi8 型であれば-256 から255 までの値を使うことができますね。

ここでん?ってなるのはisizeusize型です。

これはプログラムが動作しているコンピュータの種類に依存します。

つまり、64bit アーキテクチャなら、64bit ですし、32bitアーキテクチャ なら、32bit になります。

どの整数型を使うべきかですがRustの基準型を使いましょう。
基本型はi32 となっておりこれが 64bit アーキでも最速になるそうです。

浮動小数点型

 Rustの浮動小数点型は、f32f64で、それぞれ32ビットと64ビットサイズです。

基準型はf64 です。現代CPUではf32 と同スピードで高精度だからです。

fn main() {
    let x = 2.0; // f64

    let y: f32 = 3.0; // f32
}

論理型

ここも一般的なtrue , false のbool 型です。

fn main() {
    let t = true;

    let f: bool = false; // 明示的型注釈付きで
}

文字型

Rust では文字はchar型を使います。
特徴的なのはRustのchar 型はユニコードサイズのため絵文字とかも使うことができます。

fn main() {
    let c = 'z';
    let z = 'ℤ';
    let heart_eyed_cat = '😻';    //ハート目の猫
}

複合型

複合型は値を一つにまとめるためのものでタプルと配列があります。

タプル型

タプルは() によって複数の方の何らかの値を一つにまとめることができ、
タプルの位置ごとに型をもっています。

また、要素が一つの場合は最後の要素に, をつけます。

fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
}

中身にアクセスするには2パターンあります。
1つ目、
下記の例では一行目で作ったtup をそれぞれ個別の変数x,y,z に変換しています。
これをパターンマッチングっていいます。
こうすることでここの変数にアクセスすることができますね。

fn main() {
    let tup = (500, 6.4, 1);

    let (x, y, z) = tup;

    println!("The value of y is: {}", y);
}

2つ目、
下記の例ではアクセスしたい要素の番号をピリオドをつけて指定することでアクセスできます。

fn main() {
    let x: (i32, f64, u8) = (500, 6.4, 1);

    let five_hundred = x.0;

    let six_point_four = x.1;

    let one = x.2;
}

配列型

配列は[] によってタプル同様複数の値をまとめる型ですが、配列の場合は各要素の方は同じでなければなりません。

Rustの配列は固定長で、一度定義したらサイズを変えることはできません。

fn main() {
    let a = [1, 2, 3, 4, 5];
}

可変長としての配列はベクタ型というものがあります。

配列を使うときは下記のように値が固定されていることが確定しているときで、可読性が増す効果があります。

let months = ["January", "February", "March", "April", "May", "June", "July",
              "August", "September", "October", "November", "December"];

配列はスタック領域に確保され、[i] によって要素にアクセスできます。

タプルと同様にパターンマッチングでのアクセスも可能です。もちろん[] で。

fn main() {
    let a = [1, 2, 3, 4, 5];

    let first = a[0];
    let second = a[1];
    
    let [x, y, z]= [6, 7, 8];
    println!("the value is {}", x);
}

ちなみにRustでは配列の要素を超えてアクセスしようとするとコンパイルエラーになります。

今回もさくっとまとめてみました!ではまた次回。

カテゴリー

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次