面试题答案
一键面试设计思路
- 模块分层设计:按照功能将项目划分为不同模块,每个模块负责特定功能领域。例如,将数据处理相关代码放在
data_processing
模块,将用户界面相关代码放在ui
模块等。关联函数应定义在与结构体紧密相关的模块内,这样可保持代码的局部性,使结构更清晰。 - 依据结构体职责定义关联函数:每个结构体应专注于单一职责,关联函数围绕该职责展开。如一个表示用户的结构体
User
,其关联函数应处理与用户信息管理、权限验证等直接相关的操作。 - 利用 trait 组织关联函数:定义 trait 来抽象一组相关的行为,结构体通过实现 trait 来获得这些行为。这样可以将具有相似功能的关联函数进行统一管理,增强代码的可复用性和扩展性。
举例说明不同模块间结构体的交互
假设我们有一个简单的游戏项目,包含 player
模块和 game
模块。
// player 模块
mod player {
// 玩家结构体
pub struct Player {
pub name: String,
pub health: i32,
}
impl Player {
// 关联函数:创建新玩家
pub fn new(name: &str) -> Player {
Player {
name: name.to_string(),
health: 100,
}
}
// 关联函数:玩家受到伤害
pub fn take_damage(&mut self, damage: i32) {
self.health = self.health.saturating_sub(damage);
}
}
}
// game 模块
mod game {
use crate::player::Player;
// 游戏结构体
pub struct Game {
pub players: Vec<Player>,
}
impl Game {
// 关联函数:创建新游戏并添加初始玩家
pub fn new(player_name: &str) -> Game {
let player = Player::new(player_name);
Game {
players: vec![player],
}
}
// 关联函数:让所有玩家受到伤害
pub fn damage_all_players(&mut self, damage: i32) {
for player in &mut self.players {
player.take_damage(damage);
}
}
}
}
fn main() {
let mut game = game::Game::new("Alice");
game.damage_all_players(20);
println!("Player health: {}", game.players[0].health);
}
在上述代码中,player
模块中的 Player
结构体有自己的关联函数 new
和 take_damage
。game
模块中的 Game
结构体通过调用 Player
的关联函数 new
来创建玩家,并在 damage_all_players
关联函数中调用 Player
的 take_damage
函数,实现了不同模块间结构体的交互,同时通过关联函数提升了代码的组织性。