這篇博客來聊一下 結(jié)構(gòu)體的方法
炎辨,本質(zhì)上就是為某個(gè)結(jié)構(gòu)體而定義的方法 (函數(shù))捕透。拿面向?qū)ο笳Z言來說,寫了一個(gè)類碴萧,還可能會(huì)在這個(gè)類里寫一些方法激率,基本上同樣的套路∥鹁觯或者說乒躺,定義的這些方法,是與這個(gè)結(jié)構(gòu)體有關(guān)的低缩。
不太嚴(yán)謹(jǐn)?shù)慕忉尲蚊埃@里所謂的方法,其實(shí)就是一個(gè)函數(shù)咆繁。
結(jié)構(gòu)體方法的定義
看下面的代碼
// 這里定義一個(gè)矩形的結(jié)構(gòu)體
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
// 這里的 impl xxx 是固定的讳推,xxx 就是你要為哪一個(gè)結(jié)構(gòu)體去定義一些方法
impl Rectangle {
// 這是一個(gè)計(jì)算面積的方法
fn area(&self) -> u32 {
self.width * self.height
}
// 這是一個(gè)計(jì)算周長(zhǎng)的方法
fn perimeter(&self) -> u32 {
self.width * 2 + self.height * 2
}
// 這是一個(gè)計(jì)算能否包含另一個(gè)矩形的方法
fn can_hold(&self, other: &Rectangle) -> bool {
self.width > other.width && self.height > other.height
}
}
!!! 注意看上面的代碼及 注釋
結(jié)構(gòu)體的
方法
第一個(gè)參數(shù)總是&self
表示定義好的結(jié)構(gòu)體實(shí)例
自身
下面是使用這個(gè)結(jié)構(gòu)體
fn main() {
let r1 = Rectangle {width: 128, height: 90};
let r2 = Rectangle {width: 50, height: 30};
println!("{:#?}", r1);
println!("{:#?}", r2);
// 調(diào)用結(jié)構(gòu)體的 area() 方法
println!("r area: {}", r1.area());
// 調(diào)用結(jié)構(gòu)體的 perimeter() 方法
println!("r perimeter: {}", r1.perimeter());
// 調(diào)用結(jié)構(gòu)體的 can_hold() 方法
println!("r1 can hold r2: {}", r1.can_hold(&r2));
}
注意上面的代碼,我們打印結(jié)構(gòu)體實(shí)例的時(shí)候玩般,以前是用
{:?}
银觅,而這次用的是{:#?}
。這是因?yàn)榛滴褂?{:#?}
能以更美觀的方式打印出這個(gè)結(jié)構(gòu)體的數(shù)據(jù)來
如果要定義可以修改的結(jié)構(gòu)體究驴,只要加上 mut
就行,看下面的代碼
fn main() {
let mut r1 = Rectangle {width: 100, height: 50};
println!("{:#?}", r1);
// 修改了 r1 的 width
r1.width = 1000;
println!("{:#?}", r1);
}
關(guān)聯(lián)函數(shù)
在 impl
代碼塊中匀伏,定義一些不以 &self
作為參數(shù)的函數(shù)洒忧,這些函數(shù)被稱為 關(guān)聯(lián)函數(shù)
。就是說够颠,這些函數(shù)熙侍,不針對(duì)某一個(gè)具體的結(jié)構(gòu)體實(shí)例,而是針對(duì)這個(gè)結(jié)構(gòu)體本身履磨。
直接看下面的代碼
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
// 創(chuàng)建一個(gè) 矩形 實(shí)例
fn new(width: u32, height: u32) -> Rectangle {
Rectangle {
width,
height,
}
}
// 創(chuàng)建一個(gè) 正方形 實(shí)例
fn new_square(size: u32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}
}
下面代碼是 使用
關(guān)聯(lián)函數(shù)
fn main() {
let r1 = Rectangle::new(100, 80);
let r2 = Rectangle::new_square(100);
println!("{:#?}", r1);
println!("{:#?}", r2);
}
對(duì)于一個(gè)結(jié)構(gòu)體方法的調(diào)用蛉抓,我們使用
r1.area()
這樣的形式。而對(duì)于關(guān)聯(lián)函數(shù)
的調(diào)用剃诅,需要使用::
這個(gè)操作符巷送。