gpt4 book ai didi

rust - 我的 crate 如何检查依赖项的选定功能?

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

我正在寻找一种基于依赖项的功能选择来提供特殊功能的方法。
有图书馆crate-a有特点feature-afeature-b .我想创建一个新库 crate-b这取决于 crate-a .
二进制 crate-c取决于crate-acrate-b并为 crate-a 指定功能.
我想提供 crate-b 的不同实现的功能greet基于为 crate-a 选择的功能集.
我已经尝试过这种不起作用的方法:

// at crate-b/src/lib.rs

#[cfg(not(feature = "crate-a/feature-a"))]
pub fn greet() {
println!("General impl");
}

#[cfg(feature = "crate-a/feature-a")]
pub fn greet() {
println!("Feature-A impl");
}
有什么方法可以查看 crate-a的特征来自 crate-b ?
我同时控制 crate-acrate-b .甚至应该在 crate-a 中更改某些内容的方法为我工作。

最佳答案

我能想到的在编译时实现这一点的唯一方法是有条件地在 crate-a 中定义宏。取决于启用的功能。例如,一个宏当feature-a指定将如下所示:

// in crate-a/src/lib.rs
#[cfg(feature = "feature-a")]
#[doc(hidden)]
#[macro_export]
macro_rules! __cfg_feature_a {
( $( $tok:tt )* ) => { $( $tok )* }
}

#[cfg(not(feature = "feature-a"))]
#[doc(hidden)]
#[macro_export]
macro_rules! __cfg_feature_a {
( $( $tok:tt )* ) => {}
}
这些宏可供其他 crate 使用,但对 crate-a 的公共(public) API 隐藏通过 #[doc(hidden)] ,并且它们会根据功能标志扩展为与给定相同的标记或空主体。然后您可以在 crate-b 中使用它们像这样:
// in crate-b/src/lib.rs
pub fn unconditional_fn() {}

crate_a::__cfg_feature_a! {
pub fn cfg_feature_a_fn() {}
}
这显然是一个非常 hacky 的解决方案,并且需要为您使用的每种功能标志组合定义大量样板文件,但应该适用于基于 crate-a 功能的编译时条件编译.
编辑:供引用, serde使用与它的 serde_if_integer128 类似的方法宏。

关于rust - 我的 crate 如何检查依赖项的选定功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64546459/

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