結構方法

要在結構上宣告方法(即​​,可以在 struct 上呼叫的函式,或者 struct 型別的值),建立一個 impl 塊:

impl Foo {
    fn fiddle(&self) {
        // "self" refers to the value this method is being called on
        println!("fiddling {}", self.my_string);
    }
}

// ...
foo.fiddle(); // prints "fiddling hello"

&self 這裡表示對 struct Foo 例項的不可變引用是呼叫 fiddle 方法所必需的。如果我們想要修改例項(例如更改其中一個欄位),我們將改為使用 &mut self(即可變引用):

impl Foo {
    fn tweak(&mut self, n: isize) {
        self.my_num = n;
    }
}

// ...
foo.tweak(43);
assert_eq!(foo.my_num, 43);

最後,我們還可以使用 self(注意缺少 &)作為接收器。這要求例項由呼叫者擁有,並且在呼叫方法時將導致例項被移動。如果我們希望使用,銷燬或以其他方式完全轉換現有例項,這將非常有用。這種用例的一個例子是提供連結方法:

impl Foo {
    fn double(mut self) -> Self {
        self.my_num *= 2;
        self
    }
}

// ...
foo.my_num = 1;
assert_eq!(foo.double().double().my_num, 4);

請注意,我們還將 selfmut 作為字首,以便我們可以在再次返回之前改變自我。double 方法的返回型別也需要一些解釋。impl 塊內的 Self 指的是 impl 適用的型別(在本例中為 Foo)。在這裡,它主要是避免重新鍵入型別的簽名的有用簡寫,但在特徵中,它可以用於引用實現特定特徵的基礎型別。

要為 struct 宣告一個關聯的方法 (在其他語言中通常稱為類方法),只需省略 self 引數。這種方法在 struct 型別本身上呼叫,而不是在它的例項上呼叫:

impl Foo {
    fn new(b: bool, n: isize, s: String) -> Foo {
        Foo { my_bool: b, my_num: n, my_string: s }
    }
}

// ...
// :: is used to access associated members of the type
let x = Foo::new(false, 0, String::from("nil"));
assert_eq!(x.my_num, 0);

請注意,只能為當前模組中宣告的型別定義結構方法。此外,與欄位一樣,預設情況下所有結構方法都是私有的,因此只能由同一模組中的程式碼呼叫。你可以使用 pub 關鍵字為定義新增字首,以使其可以從其他位置呼叫。