MST

星途 面试题库

面试题:Rust结构体方法设计之高级特征与设计模式

在Rust中,基于结构体方法设计实现一个状态机模式。假设有一个结构体 `Connection` 表示网络连接,其状态可能为 `Disconnected`、`Connecting`、`Connected`。为 `Connection` 结构体设计一系列方法,使得能够处理不同状态间的转换,例如从 `Disconnected` 到 `Connecting`,从 `Connecting` 到 `Connected` 等。同时,要考虑如何防止无效的状态转换(如从 `Connected` 直接转换到 `Disconnected` 而不经过特定的断开流程),并且实现一个方法用于获取当前连接状态的描述信息。请使用Rust的特征、枚举、结构体方法等高级特性完成设计。
11.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义连接状态枚举
enum ConnectionState {
    Disconnected,
    Connecting,
    Connected,
}

// 定义连接结构体
struct Connection {
    state: ConnectionState,
}

// 定义连接状态机的行为
trait ConnectionStateMachine {
    fn connect(&mut self);
    fn disconnect(&mut self);
    fn get_state_description(&self) -> &str;
}

// 为Connection实现ConnectionStateMachine特征
impl ConnectionStateMachine for Connection {
    fn connect(&mut self) {
        match self.state {
            ConnectionState::Disconnected => {
                self.state = ConnectionState::Connecting;
                println!("正在连接...");
            }
            ConnectionState::Connecting => {
                self.state = ConnectionState::Connected;
                println!("已连接");
            }
            ConnectionState::Connected => {
                println!("已经处于连接状态,无法重复连接");
            }
        }
    }

    fn disconnect(&mut self) {
        match self.state {
            ConnectionState::Connected => {
                // 特定的断开流程,例如发送断开请求等
                println!("正在执行断开流程...");
                self.state = ConnectionState::Disconnected;
                println!("已断开连接");
            }
            ConnectionState::Connecting => {
                println!("连接中,无法断开");
            }
            ConnectionState::Disconnected => {
                println!("已经处于断开状态,无法重复断开");
            }
        }
    }

    fn get_state_description(&self) -> &str {
        match self.state {
            ConnectionState::Disconnected => "断开连接",
            ConnectionState::Connecting => "正在连接",
            ConnectionState::Connected => "已连接",
        }
    }
}

fn main() {
    let mut conn = Connection {
        state: ConnectionState::Disconnected,
    };
    conn.connect();
    conn.connect();
    println!("当前状态描述: {}", conn.get_state_description());
    conn.disconnect();
    conn.disconnect();
}

代码说明

  1. 枚举定义:使用 enum 定义 ConnectionState 枚举,表示连接的三种状态。
  2. 结构体定义Connection 结构体包含一个 state 字段,类型为 ConnectionState
  3. 特征定义ConnectionStateMachine 特征定义了三个方法:connectdisconnectget_state_description
  4. 特征实现:为 Connection 结构体实现 ConnectionStateMachine 特征,在 connectdisconnect 方法中,通过 match 语句处理不同状态间的转换,并防止无效转换。get_state_description 方法返回当前状态的描述信息。
  5. 主函数:在 main 函数中创建 Connection 实例,并调用相关方法进行状态转换和获取状态描述。