结构体这玩意很多语言都见过,基本上都是纯纯的一样的定义,但第一次看到元组结构体,真不知什么玩意,四不像。看着是结构体, 但偏偏还有入参。这或许就是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()方法获取。