我正在尝试使用类型状态模式来实现服务器模拟,但我迷失在语法中。我有以下基于本教程的类型状态模式服务器代码:
/// Represents a PostgreSQL server.
pub struct Server<S: Messages> {
marker: std::marker::PhantomData<S>,
configuration: Configuration
}
/// Trait used to anchor message types.
pub trait Messages {}
/// Stopped server
pub enum Stopped {}
impl Messages for Stopped {}
impl Server<Stopped> {
pub fn new(configuration: Configuration) -> Self {
Server{configuration, marker: Stopped}
}
}
/// Methods available to all messages
impl<S> Server<S> where S: Messages {}
Run Code Online (Sandbox Code Playgroud)
但我无法创建该new方法,因为我不知道如何处理该marker属性。有任何想法吗?
PhantomData 实现 Default,你可以用以下方法初始化它:
Server {
configuration,
marker: Default::default(),
//marker: PhantomData::<Stopped> //or using explicit type
//marker: PhantomData // or sugar
}
Run Code Online (Sandbox Code Playgroud)
由于不会使用标记字段,您可能希望将其定义为_marker: Default:default().
可能有帮助的技巧:
如果您有多个Sized通用参数,则可以使用元组而不是添加多个标记字段:
pub struct Server<T, S, U, V> {
_marker: std::marker::PhantomData<(T, S, U, V)>,
configuration: Configuration
}
Run Code Online (Sandbox Code Playgroud)
注意:元组仅在内部有 12 个或更少的元素时才实现 Default,但这在这里不是问题,因为内部默认值永远不会被调用。(游乐场)
也可以看看: