#type #macro #erasure #impl-trait

whiteout

提供将任何值的类型擦除为给定特质的 impl Trait 的宏

3 个版本 (稳定)

使用旧的 Rust 2015

1.0.1 2019 年 10 月 12 日
1.0.0 2019 年 9 月 27 日
0.1.0 2017 年 9 月 1 日

#1184 in Rust 模式

MIT 许可证

7KB

whiteout

crates.io 徽章 文档 许可证:MIT

whiteout 提供将任何值的类型擦除为给定特质的 impl Trait 的宏。这为您提供只能使用该特质的方法的值,并且其类型是不可命名的。

#[macro_use] extern crate whiteout;
fn main() {
    let a = erase!(10, std:ops::Add<i64, Output=i64>);
    assert_eq!(a + 10, 20);
}

由于我们有时希望将这些值一起使用,whiteout 提供了单次宏和一个返回一致不可命名类型的函数的宏,允许使用多个擦除值。请参阅文档以获取更多信息。


lib.rs:

whiteout 提供将任何值的类型擦除为给定特质的 impl Trait 的宏。

示例

可以使用 erase! 宏擦除单个值。

let a = erase!(10, std::ops::Add<i64, Output=i64>);
let b = erase!(5, std::ops::Add<i64, Output=i64>);
assert_eq!(a + 10, 20);
assert_eq!(b + 10, 15);
// This fails, the types are opaque
// assert_eq!(a + b, 15);

尽管这些擦除值可以一起使用,但它们有不同的匿名类型。因此,您有时需要 eraser! 宏。

#[macro_use]
extern crate whiteout;

// Define a custom trait into which types will be erased.
trait MyTrait: 
    std::ops::Add<Self, Output=Self>  // Allow the operation we need
    + std::convert::From<i32>  // Allow converting from concrete values
    + std::fmt::Debug  // Allow printing (for use with assert!())
    + PartialEq  // Allow comparison (for use with assert_eq!())
    {}

// Implement MyTrait for all possible types.
impl<T> MyTrait for T 
    where T: std::ops::Add<Self, Output=Self> 
    + std::convert::From<i32> 
    + std::fmt::Debug
    + PartialEq
    {}

// Create an eraser function for the custom trait
eraser!(erase_my_trait, MyTrait);

fn main() {
    // Use the eraser function. 
    // If we used erase!(10, MyTrait); for these
    // they would be of different types.
    let a = erase_my_trait(10);
    let b = erase_my_trait(5);
    assert_eq!(a + b, 15.into());
}

无运行时依赖