Rustで特徴的と思ったところ(その1)

Rustのオンラインブック、

https://doc.rust-jp.rs/book-ja/title-page.html

を読み始めて、第5章までの分です。自分の他言語経験から見てユニークと思えるところを、並びは時系列です。特にC/C++などで起こるメモリ管理上のバグの作り込みを防ぐためのメモリ管理機能(所有権)がいちばん特徴的だろうと思う。

・crate : クレートはRustソースコードを集めたものである、バイナリ形式でもそういうけども

・Cargo.toml : Tom’s Obvious, Minimal Language、パッケージのリストと版数を指定するテキストファイル

・Cargo : Rustのビルドシステム兼パッケージマネージャ

 cargo checkでコンパイルエラーがチェックできる

・println! : !はマクロの意味、簡易に結果出力で使用で構造体ではコンパイルエラー、回避方法(20行ぐらい下)はありますが

・関連関数

String::new() :newは関連関数で、Stringインスタンス作成する

・参照変数のmutable化

io::stdin().read_line(&mut guess) : &mutは参照変数をミュータブルにする、記法はmut &guessではない

・Cargo.lockファイル : ビルドの再現性確保のためにクレートのバージョンを保存しておく、自動生成されユーザがいじるファイルでは無い

・traitはデータ型を分類する仕組み、crateの要素(任意の型となりうるSelfに対して定義されたメソッドの集合のこと)、類型的にはJavaのinterfaceのようなもの

・Shadowing : 前の値を新しい値で覆い隠す(shadowする)ことが許されている、型は違っていても同じでも良い

・タプルの要素は型が違っても大丈夫

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

    let five_hundred = x.0; // タプル要素へのダイレクトアクセス

・Rustの配列は固定長、ベクター型は可変長

    let a: [i32: 5] = [1, 2, 3, 4, 5];

・戻り値の指定方法は;をつけてはいけない、-> は戻り値の型を指定

fn five() -> i32 {
        5 // it’s formula not statement
}         // return value

・条件式を右辺に記述できる

let number = if condition { 5 } else { 6 }; // possible if both type is same

・所有権:これはRustのコア機能(メモリ管理がRustの一大機能)、本質はヒープ領域の管理になりますが

・println!に指示する: 直接エンドユーザ向けの出力で、構造体はこれではダメで

#[derive(Debug)]行を追加必要

・メソッド記法は構造体の文脈で定義(impl Rectangle)される、Golangの構造体との関連付けに書式は違うが似てると思う

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 { // implしてるから&self、構造体インスタンスへの参照
        self.width * self.height
    }
}

・関連関数:implブロック内で定義される、selfを引数に取らない関数。構造体と関連づけられていないからメソッドではない、String::new()はその例。よくある使い方は構造体のインスタンスを返却する関数。

 

admin