#remove #call #cfg #macro

remove_macro_call

移除函数式宏调用的属性宏

4 个版本

0.1.3 2022 年 2 月 18 日
0.1.2 2022 年 2 月 18 日
0.1.1 2022 年 2 月 13 日
0.1.0 2022 年 2 月 13 日

#77 in #cfg


用于 2 个包(通过 zst

MIT/Apache 许可

10KB

移除函数式宏调用的属性宏

在没有配置的情况下,remove_macro_call 属性在无条件应用于声明性或过程函数式宏时,其结果与仅编写括号(括号、花括号或方括号)内的代码相同。

示例

use remove_macro_call::remove_macro_call;

macro_rules! reorder_statements {
    ($s1:stmt; $s2:stmt;) => {
        $s2;
        $s1;
    };
}

let mut n = 2;
reorder_statements! {
    n += 2;
    n *= 2;
}

// 2*2+2 = 6
assert_eq!(n, 6);

// The new variable shadows the old one
let mut n = 2;

n += 2;
n *= 2;

// (2+2)*2 = 8
assert_eq!(n, 8);

// The new variable shadows the old one
let mut n = 2;
#[remove_macro_call]
reorder_statements! {
    n += 2;
    n *= 2;
}

// (2+2)*2 = 8
assert_eq!(n, 8);

然而,通过使用 cfg_attr 属性,remove_macro_call 允许条件性地移除宏调用。这种组合的一个重要应用是在提供稳定工具链的同时,也提供依赖于 Nightly 功能的功能。

示例

#![cfg_attr(feature = "const_trait_impl", feature(const_trait_impl))]
#![cfg_attr(feature = "const_default_impls", feature(const_default_impls))]
#![cfg_attr(feature = "const_fn_trait_bound", feature(const_fn_trait_bound))]

#[cfg(not(all(
    feature = "const_trait_impl",
    feature = "const_default_impls",
    feature = "const_fn_trait_bound"
)))]
use const_trait_impl::unconst_trait_impl;
use core::{default::Default, marker::PhantomData};
#[cfg(all(
    feature = "const_trait_impl",
    feature = "const_default_impls",
    feature = "const_fn_trait_bound"
))]
use remove_macro_call::remove_macro_call;

// Since ZST is both Eq and and PartialEq, it has structural match
// https://github.com/rust-lang/rust/issues/63438
#[derive(Clone, Debug, Hash, Eq, Ord, PartialEq, PartialOrd, Copy)]
pub struct ZST<T: ?Sized>(PhantomData<T>);

pub trait TraitName {}

#[cfg_attr(
    all(
        feature = "const_trait_impl",
        feature = "const_default_impls",
        feature = "const_fn_trait_bound"
    ),
    remove_macro_call
)]
unconst_trait_impl! {
    impl<T: ?Sized> const TraitName for ZST<T> {}
}

// With `cargo build --features const_trait_impl, const_default_impls, const_fn_trait_bound`
// or with `cargo build --all-features, the code below is expanded as is. Otherwise,
// it gets "unconsted" to be supported by stable toolchain.
#[cfg_attr(
    all(
        feature = "const_trait_impl",
        feature = "const_default_impls",
        feature = "const_fn_trait_bound"
    ),
    remove_macro_call
)]
unconst_trait_impl! {
    impl<T: ~const TraitName + ?Sized> const Default for ZST<T> {
        fn default() -> Self {
            ZST(Default::default())
        }
    }
}

注意:在实际代码中,上述示例可以替换为一个更简单的版本,该版本依赖于 cfg_aliases 包。

实际示例

您可以在此处了解更多关于 const_trait_impl 的信息

许可

根据您的选择,在 Apache License 2.0 或 MIT 许可下许可。请参阅 Apache 许可证版本 2.0MIT 许可证
除非您明确表示,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在此包中的贡献,均应按上述方式双许可,而无需任何附加条款或条件。

依赖项

~1.5MB
~35K SLoC