#union #proc-macro #enums #type

union_type

一个将联合类型引入Rust的过程宏

3个不稳定版本

0.1.0 2020年10月23日
0.0.1 2020年10月23日
0.0.0 2020年10月23日

#1769 in 过程宏

无许可

9KB
137 代码行

union_type

license Crates.io Docs.rs

为Rust添加联合类型支持!

为什么我们需要这个?

请参阅此处

结果看起来像什么?

#[macro_use]
extern crate union_type;

use std::convert::TryInto;
use std::fmt::Display;

#[derive(Debug, Clone)]
struct A(String);

impl A {
    fn f(&self, a: i32) -> i32 {
        println!("from A {}", a + 1);
        a + 1
    }

    fn g<T: Display>(&self, t: T) -> String {
        self.0.clone() + &format!("{}", t)
    }
}

#[derive(Debug, Clone)]
struct B(i32);

impl B {
    fn f(&self, a: i32) -> i32 {
        println!("from B {}", a + self.0);
        a + self.0
    }

    fn g<T: Display>(&self, t: T) -> String {
        format!("{}:{}", self.0, t)
    }
}

union_type! {
    #[derive(Debug, Clone)]
    enum C {
        A,
        B
    }
    impl C {
        fn f(&self, a: i32) -> i32;
        fn g<T: Display>(&self, t: T) -> String;
    }
}

fn main() {
    let a = A("abc".to_string());
    let mut c: C = a.into();
    c.f(1);
    let b = B(99);
    c = b.into();
    c.f(2);
    println!("{:?}", c);
    println!("{}", c.g(99));
    let b: B = c.try_into().unwrap();
    println!("{:?}", b);
}

输出为

from A 2
from B 101
B(B(99))
99:99
B(99)

依赖项

~1.5MB
~35K SLoC