Rust the book - 第5章

Posted by johtani on Thursday, April 2, 2020

目次

前回の記事はこちら。自分用のメモなので、読みにくいかもです。

第5章

構造体です。勝手知ったるなんとやら?オブジェクト指向的な部分は問題ないかなぁと。

定義とインスタンス化

  • structで定義
  • インスタンスの生成は引数は順不同でOK
  • 構造体のインスタンスを可変にするとフィールドの値も変更可能
    • 特定のフィールドのみ可変にすることは不可能
  • インスタンス化する関数の最後でreturnなしでインスタンスの返却を暗黙にできる(return書いてほしいな。。。)
  • インスタンス化時にフィールド初期化省略記法が可能(これはちょっと便利?)
  • 構造体更新記法..user1のように、明示的に設定されていない他のフィールドをコピーしてくれる機能あり

タプル構造体

  • タプル構造体!? struct Color(i32, i32, i32);
    • いつ使うんだろう?

ユニット様構造体

  • ユニット様構造体 = フィールドのない構造体。トレイトを実装したいけどインスタンスで持つ値はない場合に利用

ライフタイム

  • 構造体が参照を持つときにライフタイムという話が出てくる。なるほど。
    • ライフタイム指定子が必要になる -> 10章での話

プログラム例

  • タプルを引数かぁ。タプルは慣れないので構造体作りそう
  • Debugトレイトと{:?}という書き方
    • derive(Debug)でデバッグ用のトレイトを自動で実装=継承してくれる
    • {:#?}だとpretty printになる(改行とか入る)

この辺の便利なトレイとは付録Cにあるらしい。この辺はやりながら覚えるしかないか。

メソッド記法

  • 最初の引数は必ずself
  • implは構造体とは別の場所に書く = Javaのクラスとは違う
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}
  • 参照じゃないselfも使えるらしい。どういうときに使うんだろう?

関連関数

  • selfなしの関数をimplにかける。Javaのスタティックメソッドみたいな感じ

その他

  • implブロックがあちこちにかける。これはつらいな。。。
  • 2つにわかれたimplブロックに同じメソッドを書いてみたら、CLionのプラグインではエラーを検知してもらえなかった。
    • cargo buildではきちんとエラーが表示された。
  • 複数のimplブロックが有用になるケースは第10章で見ますが、そこではジェネリック型と、トレイトについて議論します。

    • 人の構造体に自分のトレイトを適用したりもできる。

実験

スコープとかどうなりそう?って実験もしてみた。

fn main() {
    trait Hoge {
        fn trim(&self);
    }

    impl Hoge for String {
        fn trim(&self) {
            println!("hogehoge {}", &self);
        }
    }
    let c = String::from("hoge");
    c.trim();
    println!("{}", fuga(&c));
}

fn fuga(d: &String) -> &str {
    d.trim()
}

出力はこんな感じ

hogehoge hoge
hoge

まとめ

気になったのは以下の点。そのうち分かるようになってくるのかな。

  • 構造体更新記法はどういったときに使うのを想定して作ったんだろう?とか
  • 可変長引数はマクロじゃないとだめ

comments powered by Disqus