さて、今日もやっていきます。型の続きからです。
タプル
前回少し紹介しましたが補足です。
ユニット型
要素0のタプルなんていうのもあります。これはタプルではあるものの伝統的にユニット型と呼ばれます。意味のある値を返す必要がないときはこれを返します。例えば配列をインプレースにソートするslice::sort()などはそれに当たります。
fn sort(&mut self) -> ();
ポインタ型
参照
C言語などと同様、参照には&
を使い、参照外しには*
を用います。例えば型&i64は64bit符号あり整数値への参照となります。xに対する参照&xを作ることをRust界隈ではxへの参照を借用すると言います。Rustではnull参照を作成することはできず、mutをつけない限り参照を変更することはできません。
ヒープへの確保
Box::new()を用います。
let v = [2, 3]; let b = Box::new(v);
配列
配列は固定長です。全ての要素は同じ型でなければいけません。[型; 要素数]
で定義します。
let myArray: [u32; 3] = [3, 2, 1]; let myArray2 = [3, 2, 1]; //型推論。型は[i32; 3]になります。
要素に対するインデックスはusize型です。Pythonのように負値は使えません。範囲を超えたインデックスを使うと実行時にパニックを起こします。
let ary
ベクトル
ベクトルは可変長です。そのため、実体はヒープに格納されます。vec!マクロで作成するのが一番簡単な方法です。
let v = vec![3.0, 2.];
文字列
文字列はUnicode文字の列ですが、メモリにはUTF-8でエンコードされたバイト列として格納されます。charの配列ではありません。
文字列リテラル
普通にダブルクオートで囲みます。シングルクオートだと文字になってしまうのでダメです。定義すると文字列はreadonlyな領域に格納され、それに対する参照&strを返します。
let s = "hoge";
改行が途中にあっても問題ありません。改行文字が文字列に含まれます。
let s = "hoge bar"
String
Stringはヒープ領域に作成される可変長バッファを所有(所有は次の記事ぐらいに出てくる)します。コマンドライン引数で文字列を渡す場合など、実行時に文字列を生成する場合はこちらを利用します。内部の実装ではVec"str".to_string()
を用います。
let sheep = "sheep".to_string();
文字列の比較
Javaとは異なり普通に==
や!=
で比較できます。
終わりに
著者は今日福岡から帰ってきたばかりなので短いです。次回はRustのキモ、所有について書こうと思います。