結構方法
要在結構上宣告方法(即,可以在 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);
請注意,我們還將 self
與 mut
作為字首,以便我們可以在再次返回之前改變自我。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
關鍵字為定義新增字首,以使其可以從其他位置呼叫。