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模式
7KB
phantom-enum 0.9.5
用于创建幻影枚举的简单宏库。只是简单的糖。
幻影类型枚举是一种类似于枚举的排列,其中枚举是一个模块和特质,而变体是(不可实例化)类型。
这对于静态表示无法出错的状态机非常有用。
#[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。