メインコンテンツにスキップ
モジュール 4 · レッスン 2 / 2コース内の 8/14~12 min
モジュールのレッスン (2/2)

メソッドと impl ブロック

Rustでは、メソッドは関数に似ていますが、メソッドは構造体(または列挙型またはトレイト)のコンテキスト内で定義され、その最初のパラメータは常に self で、メソッドが呼び出される構造体のインスタンスを表します。

impl を使用したメソッドの定義

構造体にメソッドを定義するには、構造体の名前を指定した impl (実装) ブロックを使用します。

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

impl Rectangle {
    // This is an instance method. It takes &self for reading.
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };

    // Call the method using dot notation
    println!("The area is: {}", rect.area());
}

関連する (静的) 関数

最初のパラメーターとして self を 受け入れない impl ブロック内で定義された関数は、関連関数 (他の言語の静的メソッドに相当) と呼ばれます。

これらは、構造体の新しいインスタンスを返すコンストラクターとしてよく使用されます。これらを呼び出すには、二重コロン :: 構文を使用します。

Rust
impl Rectangle {
    // Associated function
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

fn main() {
    // Call the associated function
    let sq = Rectangle::square(10);
}

状態を変更するメソッド: &mut self

メソッドで構造体のフィールドを変更する必要がある場合は、最初のパラメータを &mut self として宣言する必要があります。メソッドが呼び出されるインスタンス自体は、可変として宣言される必要があります (let mut)。

Rust
impl Rectangle {
    fn double_size(&mut self) {
        self.width *= 2;
        self.height *= 2;
    }
}

自分で試してみてください

運動#rust.m4.l2.e1
試行回数: 0読み込み中…

&self を受け取り、u32 (幅と高さの乗算) を返す area メソッドを定義して、impl ブロッ​​クを完成させます。

エディターを読み込み中…
ヒントを表示

「impl Rectangle」ブロック内に「fn area(&self) -> u32 { self.width \* self.height }」と書きます。

3 回の試行後に解決策が利用可能になります

運動#rust.m4.l2.e2
試行回数: 0読み込み中…

impl Rectangle 内で square 関連関数を定義します。この関数は、size: u32 を受け取り、size に等しい幅と高さの Rectangle インスタンスを返します。

エディターを読み込み中…
ヒントを表示

`impl`ブロック内に`fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size } }`と書きます。

3 回の試行後に解決策が利用可能になります

運動#rust.m4.l2.e3
試行回数: 0読み込み中…

スケール ミューテーター メソッドを impl ブロッ​​ク内の Rectangle に追加します。 scale メソッドは、self への変更可能な参照 (&mut self) と、factor: u32 パラメーターを受け取り、Rectangle の幅と高さの両方に係数を乗算する必要があります。

エディターを読み込み中…
ヒントを表示

self.width と self.height に factor を乗算して更新するには、 fnscale(&mut self,actor: u32) を実装します。

3 回の試行後に解決策が利用可能になります