[Chapter 5-3]Rustメソッド(method)



メソッド(method)は関数に似ています.ただし、メソッドは、関数とは異なり、構造の内容内(または列挙オブジェクトまたはツリーオブジェクト内)に定義されます.最初のパラメータは常にselfであり、メソッド呼び出しの構造体インスタンスを表す.

メソッドの定義


chapter 5-2のコードを変更しましょう.パラメータがRectangleインスタンスのarea関数をRectangle構造体で定義されたareaメソッドに変更します.
#[derive(Debug)]
struct Rectangle {
    length: u32,
    width: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.length * self.width
    }
}

fn main() {
    let rect1 = Rectangle { length: 50, width: 30 };

    println!(
        "The area of the rectangle is {} square pixels.",
        rect1.area()
    );
}
Rectangle  で定義します.  impl  起動ブロック.  area  関数#カンスウ#  impl  カッコ内に移動し、フラグ本体内のすべての位置の最初のパラメータを指定します.  selfに変更されました.  main  関数では、  Rectangle  実例の上着  area  方法を簡略化するために メソッド構文(method syntax) サポートされています.
前のコードから  &Rectangle  に示すように  &self  使用されています.所有権を取得する必要はありません.データを読み込むだけです.

より多くのパラメータを持つ方法


今回は、Rectangleの例が別のRectangleの例であると仮定し、2番目のRectangleselfに完全に入ることができる場合は、trueに戻って、そうでなければfalseに戻ってみる.
impl Rectangle {
    fn area(&self) -> u32 {
        self.length * self.width
    }

    fn can_hold(&self, other: &Rectangle) -> bool {
        self.length > other.length && self.width > other.width
    }
}

fn main() {
    let rect1 = Rectangle { length: 50, width: 30 };
    let rect2 = Rectangle { length: 40, width: 10 };
    let rect3 = Rectangle { length: 45, width: 60 };

    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
}
結果:
Can rect1 hold rect2? true
Can rect1 hold rect3? false
rect1.can_hold(&rect2)&rect2を超え、これはRectanglerect2の不変性借用である.rect2しか読みたくないからです.mainは、rect2の所有権を保持し、can_holdメソッド呼び出し後に再使用することができる.

関連関数

self  パラメータなしの関数  impl  で定義できます.これは. 関連関数 と呼ぶ.これは、この関数が構造体に関連しているためです.一緒に作業する構造体インスタンスがないため、メソッドではなく関数です.
関連関数は主に、次の例に示すように、新しい構造体インスタンスを返す構造関数に使用されます.
impl Rectangle {
    fn square(size: u32) -> Rectangle {
        Rectangle { length: size, width: size }
    }
}
関連関数を呼び出すには、let sq = Rectangle::square(3);などの構造体名付き::構文を使用します.