Rust 中的方法,具体来讲是结构体类型中的方法,以及结构体的关联函数。
结构体方法
在 JS 中,函数和方法是同一个概念,只不过语境不同。一个独立的函数就叫函数,一个对象的成员是一个函数的化,通常称为某某对象的某某方法。
方法
Rust 中和 JS 对象相对应的类型叫作结构体。
Rust 中使用 impl
块为结构体添加一个方法。impl
关键字是 implements
的缩写,实现的意思,表示为结构体实现方法和函数。
结构体的方法本质上就是函数,使用 fn
关键字来声明,可以接收参数,来执行一段逻辑,并有返回值。方法的第一个参数永远为 &self
, self
表示调用该方法的结构体实例,类似于面向对象编程语言中的 this
,可以通过 self
关键字访问结构体和其他方法的数据。
#[derive(Debug)]
// 定义一个表示平面坐标系上的点的结构体
struct Point {
x: u32,
y: u32,
}
impl Point {
// 类似于面向对象编程中对象的实例方法
// 该方法返回 Point 结构体的 x 坐标
fn get_x(&self) -> u32 {
self.x
}
// 修改结构体中的数据,需要使用可变引用 &mut
// 该方法修改 Point 结构体的 x 坐标
fn set_x(&mut self, x: u32) {
self.x = x;
}
}
访问结构体中的方法使用单点号 .
:
fn main() {
let mut p = Point {10, 10};
println!("{:?}", p);
println!("{:?}", p.get_x());
p.set_x(20);
println!("{:?}", p);
}
关联函数
impl
除了能为结构体添加方法外,还能添加关联函数(associated function )。
关联函数和方法的区别是:
- 关联函数不用操作结构体的数据,也就不用接收
&self
作为参数 - 关联函数的调用使用双冒号
::
通常会使用关联函数为结构体创建一个构造函数,还是以上面的 Point 结构体为例:
impl Point {
// 构造方法
fn new(x: u32, y: u32) -> Point {
Point { x, y }
}
}
fn main() {
let p = Point::new(10, 10);
println!("{:?}", p);
}
前面学习字符串类型时,使用 String::from
来创建一个字符串实例,from
就是 String
的关联函数。还可以使用 String::new
创建一个空的字符串实例。
小结
本文介绍了 Rust 中函数在不同情境下的使用。本质上函数,方法,关联函数,都是函数。在结构体中函数可以分为方法和关联函数,方法是用来操作结构体数据的,关联函数用来实现和结构体本身无关的逻辑。