gpt4 book ai didi

rust - DRY for Rust 条件编译功能

转载 作者:行者123 更新时间:2023-12-03 11:28:55 25 4
gpt4 key购买 nike

我的库有几个功能,比如 F1F2F3F4,..其中一个可以同时处于事件状态。这些功能进一步分类为类型 ABC,例如,功能 F1F2A类型,F3F4B类型,依此类推。

我有好几次这样的代码(在库中)

#[cfg(any(feature = "F1", feature = "F2"))]
fn do_onething_for_type_A(... ) {
// repeating same cfg predicate as above
#[cfg(any(feature = "F1", feature = "F2"))]
fn do_another_thing_for_type_A(... ) {
#[cfg(any(feature = "F3", feature = "F4"))]
fn do_onething_for_type_B(... ) {

有没有一种方法可以简洁地编写上面的 cfg 谓词,这样我就不必在 #[cfg(any(.. every我什么时候有这种情况?冗长不是唯一的问题。每次我介绍一个新功能时,比如 F5 类型,比如 A,我必须更新#[cfg(any(feature = "F1", feature = "F2"))]#[cfg(any(feature = "F1", feature = "F2", feature = "F5"))].

我的第一个想法是创建一个基于特征的属性,然后如下使用该属性,但我似乎做不到。

#[cfg(any(feature = "F1", feature = "F2"), typeA)]
#[cfg(any(feature = "F3", feature = "F4"), typeB)]

#[typeA]
fn do_onething_for_type_A(... ) {...}

#[typeA]
fn do_another_thing_for_type_A(... ) {

#[typeB]
fn do_onething_for_type_B(... ) {

为类型 ABC 声明一个新特性是我最后的选择。

最佳答案

您可以使用 cfg_aliases crate,尽管它需要添加构建脚本。

// Cargo.toml
[build-dependencies]
cfg_aliases = "0.1.0"
// build.rs
use cfg_aliases::cfg_aliases;

fn main() {
// Setup cfg aliases
cfg_aliases! {
type_a: { any(feature = "F1", feature = "F2") },
type_b: { any(feature = "F3", feature = "F4") },
type_c: { feature = "F5" },
}
}
#[cfg(type_a)]
fn do_onething_for_type_A(... ) {...}

#[cfg(type_a)]
fn do_another_thing_for_type_A(... ) {

#[cfg(type_b)]
fn do_onething_for_type_B(... ) {

或者你可以定义宏like Tokio does .

macro_rules! cfg_type_a {
($($item:item)*) => {
$(
#[cfg(any(feature = "F1", feature = "F2"))]
$item
)*
}
}
cfg_type_a! {
fn do_onething_for_type_A() {
...
}
}
cfg_type_b! {
fn do_onething_for_type_B() {
...
}
}

请注意,基于宏的方法可能会给使用 CLion IDE 的库的任何用户带来麻烦。使用该 IDE 时,您必须启用

Settings > Languages & Frameworks > Rust > Expand declarative macros: Use experimental engine

为上述宏后面定义的事物获取类型完成。

关于rust - DRY for Rust 条件编译功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62863436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com