Rust by Example読んだ

Rustの知見を深めるために読んでみた。

doc.rust-lang.org

1章, 2章

1. Hello World

1.1 Comments

コメントの書き方

ブロックコメントはネストできる。

/* /* /* print!("1"); */ print!("2"); */ print!("3"); */ print!("4");

1.2 Formatted print

マクロの主なものとしては以下となる。

マクロ 説明
format! 結果を String として返す
print! 標準出力に出力
println! 標準出力に出力(改行あり)
eprint! 標準エラーに出力
eprintln! 標準エラーに出力(改行あり)

マクロの詳細な使い方はstd::fmt モジュールのUsageを参照。

1.2.1 Debug

マクロのフォーマット文字列に {:?} マーカーを利用する。

カスタム実装をする場合は std::fmt::Debug トレイトを実装する必要がある。

以下のように derive 属性を利用することによって構造体に Debug トレイトを自動で実装してくれる。

#[derive(Debug)]
struct Point {x: i32, y: i32}

またマクロのフォーマット文字列に {:#?} マーカーを利用すると整形して出力することができる。

1.2.2 Display

マクロのフォーマット文字列に {} マーカーを利用する。

カスタム実装する場合は std::fmt::Display トレイトを実装する必要がある。

Display トレイトを実装すると型を文字列に変換する std::string::ToString トレイトが自動で実装される。

1.2.2.1 Testcase: List

Display トレイトの実装例

Display トレイト実装にあたって、 fmtstd::fmt::Result を利用するため ? 演算子を利用するとよい。

1.2.3 Fortmatting

整形出力のオプションについて

std::fmtのFormatting Parametersを参照するのがよさそう。

2. Primitives

プリミティブ型について

  • スカラー型
    • 符号付き数値型: i8, i16, i32, i64, i128, isize(ポインタサイズ)
    • 符号なし数値型: u8, u16, u32, u64, u128, usize(ポインタサイズ)
    • 実数型: f32, f64
    • 文字型: char (4バイト)
    • 真偽値型: bool
    • ユニット型: ()
  • 複合型
    • 配列
    • タプル

2.1 Literals and operators

リテラルと演算子

整数 1
実数 1.2
文字 'a'
文字列 "abc"
真偽値 true
ユニット型 ()

整数は以下の進数で表すことができる。

進数 プレフィクス
16 0x
8 0o
2 0b

数値リテラルは以下のように_を間に入れて読みやすくすることができる。

// 同じ
let n = 1_000;
let n = 1000;

// 同じ
let f = 0.000_000_1;
let f = 0.000_000_1;

演算子についてはこちらを参照

doc.rust-lang.org

2.2 Tuples

タプルは丸括弧を利用して、複数の様々な型を持つ型を作れる。

//型推論されるため実際は型は書かなくてもよい
let a :(i32, &str) = (123, "abc");

//上と同じ
let a = (123, "abc");

2.3 Arrays and Slices

配列は複数の同じ型の持つ型であり、連続したメモリに格納される。 角括弧を利用して作成する。サイズはコンパイル時に決定する。

//型、サイズともに推論されるため、型は書かなくてもよい。
let a :[i32; 3] = [1, 2, 3];

//上と同じ
let a = [1, 2, 3];

// 100個の5を持つ配列を定義
let b :[i32; 100] = [5; 100];

// 同様に型は書かなくてもよい。
let b = [5; 100];

スライスは配列と似ているが、コンパイル時にサイズは不明。

let a = [1, 2, 3];

// スライスを定義
let b: &[i32] = &a;

// 型はなくても良い。
let b = &a;