面试题答案
一键面试方法的参数
- 参数类型声明:在Rust中,定义结构体方法时,参数需要明确声明类型。例如,对于一个
Point
结构体,如果要定义一个计算两点距离的方法,参数就需要声明为Point
类型。 - self参数:结构体方法的第一个参数通常是
self
,它表示调用该方法的结构体实例。self
参数有三种形式:self
:获取结构体实例的所有权。&self
:获取结构体实例的不可变引用,这是最常用的形式,因为它允许在不获取所有权的情况下访问结构体的字段,并且可以在同一个实例上同时调用多个不可变方法。&mut self
:获取结构体实例的可变引用,允许在方法中修改结构体的字段。
可见性
- 默认可见性:在
impl
块内定义的方法默认是私有的,只能在定义该方法的impl
块内部以及同一个模块内访问。 - 公有方法:要使方法对外部可见,需要在方法定义前加上
pub
关键字。例如:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
pub fn area(&self) -> u32 {
self.width * self.height
}
}
在上述例子中,area
方法被标记为pub
,因此可以在Rectangle
结构体所在模块之外被调用。
方法名的命名规则
- 命名风格:遵循Rust的命名约定,方法名通常使用蛇形命名法(snake_case),即全部小写字母,单词之间用下划线分隔。例如
calculate_area
。 - 不能与已有标识符冲突:方法名不能与结构体中的字段名或同一作用域内的其他标识符冲突。
定义一个带参数的结构体方法示例
struct Circle {
radius: f64,
}
impl Circle {
fn circumference(&self, pi: f64) -> f64 {
2.0 * pi * self.radius
}
}
fn main() {
let my_circle = Circle { radius: 5.0 };
let result = my_circle.circumference(std::f64::consts::PI);
println!("The circumference is: {}", result);
}
在上述代码中,Circle
结构体定义了一个circumference
方法,该方法带有一个pi
参数,用于计算圆的周长。self
参数以不可变引用&self
的形式存在,这样可以在不获取所有权的情况下访问radius
字段。