本文へスキップ
BecomeCoder

Rustコース · 第7章 構造体とenum ― データを型で表す · レッスン28

メソッド ― impl で振る舞いを付ける

ブラウザで完結

導入

構造体に「振る舞い(メソッド)」を持たせると、データと処理がまとまって扱いやすくなります。Rust では impl ブロックにメソッドを書きます。ここでも第一引数の &self に、所有権・借用の考え方が顔を出します。

説明

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

impl Rectangle {
    // メソッド: 第一引数は &self(自分自身への参照)
    fn area(&self) -> u32 {
        self.width * self.height
    }

    // 関連関数: self を取らない。よく「コンストラクタ」に使う
    fn new(width: u32, height: u32) -> Rectangle {
        Rectangle { width, height }   // フィールド名と変数名が同じなら省略できる
    }
}

fn main() {
    let rect = Rectangle::new(30, 50);      // 関連関数は 型名:: で呼ぶ
    println!("面積: {}", rect.area());       // メソッドは インスタンス. で呼ぶ
}
  • impl Rectangle { ... }Rectangle のメソッドをまとめる場所。
  • fn area(&self) … 第一引数 &self は「自分自身への不変参照」。読むだけなので &self。中身を変更するメソッドなら &mut self、自分を消費(ムーブ)するなら self を取ります。ここでも借用のルールがそのまま働きます。
  • fn new(...)self を取らない 関連関数Rectangle::new(...) のように型名から呼び、インスタンス生成によく使います(Rust に「コンストラクタ」構文はなく、慣習として new を書きます)。
  • Rectangle { width, height }変数名とフィールド名が同じときは width: widthwidth と省略できます。

&self にするか &mut self にするか self にするかで、「このメソッドは自分を読むだけか、書き換えるか、消費するか」が型に表れます。所有権の考え方が、そのままAPIの設計になるわけです。

試すには

area(&self) の中で self.width = 0; と書き換えようとするとエラーになります(&self は不変借用だから)。書き換えたいメソッドは &mut self にする必要があります。メソッドのレシーバにも借用ルールが一貫して効いています。

実際に動かしてみよう

下のエディタにRustを書いて「実行」を押すと、学習用シミュレータが println! の出力を表示します(本物のrustcではなく、教材の範囲を再現した軽量エンジンです)。struct・enum・match・トレイト・Vec/String/HashMap・Option/Result なども動きます。本文の例を書き換えて動かしてみましょう(所有権・借用チェッカーのコンパイルエラーは再現しないため、動きの確認用として使ってください)。

Rust — ブラウザ内で実行(学習用シミュレータ)

Rustの教材サブセットを動かす学習用シミュレータを読み込みます(本物のrustcではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。