7个版本 (1个稳定版)

使用旧的Rust 2015

1.0.0 2016年6月8日
0.9.5 2015年4月25日
0.9.3 2015年2月24日
0.9.2 2015年1月7日
0.9.0 2014年11月11日

#2158 in Rust模式

MIT/Apache

7KB

phantom-enum 0.9.5

Build Status

用于创建幻影枚举的简单宏库。只是简单的糖。

幻影类型枚举是一种类似于枚举的排列,其中枚举是一个模块和特质,而变体是(不可实例化)类型。

这对于静态表示无法出错的状态机非常有用。

#[macro_use] #[no_link]
extern crate phantom_enum;

phantom_enum! {
    /// Put things here, of course
    pub enum TableItem {
        /// A bottle with a paper label reading “DRINK ME”.
        Potion,
        /// A cake with the words “EAT ME” marked in currants.
        Cake
    }
}

struct Person<T> {
    name: &'static str,
}

// Note how this restricts the methods to only meaningful types.
// (I look forward to generic bounds in struct definitions!)
impl<T: TableItem::Impl> Person<T> {
    fn new(name: &'static str) -> Person<T> {
        Person {
            name: name,
        }
    }
}

impl Person<TableItem::Potion> {
    fn drink_it(self) -> Person<TableItem::Cake> {
        println!("Shrinking! Oh look, there’s a box down here!");
        Person {
            name: self.name,
        }
    }
}

impl Person<TableItem::Cake> {
    fn eat_it(self) -> () {
        println!("Growing! OK, that’s enough of the story.");
        // Who can remember what comes next, anyway?
    }
}

fn main() {
    let person = Person::new("Alice");
    let person = person.drink_it();
    person.eat_it();
}

正如您在这个示例中所观察到的,如果您有一个 Person<Potion>,您就不能调用 .eat_it();为了这样做,您必须有一个 Person<Cake>。同样,一旦您喝过那个药水,就不能再喝了。

用法

使用Cargo。 http://crates.io/crates/phantom-enum

作者

Chris Morgan (chris-morgan) 是这个库的主要作者和维护者。

许可

此库以与Rust类似的条款分发:MIT许可和Apache许可(版本2.0)的双重许可。

有关详细信息,请参阅LICENSE-APACHE、LICENSE-MIT和COPYRIGHT。

无运行时依赖