Rust的元组结构体

Rust中的设计之妙🦀

Posted by hughnian on February 28, 2025

结构体这玩意很多语言都见过,基本上都是纯纯的一样的定义,但第一次看到元组结构体,真不知什么玩意,四不像。看着是结构体, 但偏偏还有入参。这或许就是rust的精妙之处,看着很熟悉的东西,但有感觉不一样。真正了解了用途,确实觉得rust的设计还是很有独到。

    #[derive(Debug, Clone)]
    pub struct ServiceConfig(Rc<Inner>);  //这里的元组结构体, Rc rust中的引用计数

    #[derive(Debug)]
    struct Inner {
        keep_alive: KeepAlive,
        client_request_timeout: Duration,
        client_disconnect_timeout: Duration,
        secure: bool,
        local_addr: Option<std::net::SocketAddr>,
        date_service: DateService,
    }

    impl ServiceConfig {
        pub fn new(    //只能通过new进行构造实例
            keep_alive: KeepAlive,
            client_request_timeout: Duration,
            client_disconnect_timeout: Duration,
            secure: bool,
            local_addr: Option<net::SocketAddr>,
        ) -> ServiceConfig {
            ServiceConfig(Rc::new(Inner {
                keep_alive: keep_alive.normalize(),
                client_request_timeout,
                client_disconnect_timeout,
                secure,
                local_addr,
                date_service: DateService::new(),
            }))
        }

        pub fn keep_alive(&self) -> KeepAlive {
            self.0.keep_alive
        }

        //省略其他方法...
    }

零成本抽象

  • 作用:为已有类型创建新类型别名,但提供更强的类型安全。
  • 特点:✅ 完全隐藏实现细节(无法直接访问 .0)。✅ 强制通过方法访问(如 keep_alive() 方法)。✅ 未来可灵活修改内部实现(比如改成 Arc)。

封装实现细节

内部可变性控制:通过 Rc<Inner> 实现共享所有权,所有字段都是私有的(Inner结构体未公开)

高效配置共享:通过Rc实现轻量级克隆,let config_clone = config.clone();仅增加引用计数。

运行时安全保障:所有修改操作必须通过结构体方法,如keep_alive只能通过config.keep_alive()方法获取。