有没有办法将Rust的功能标志支持应用到函数参数?我有一个函数,它接受一串输入,但其中一个输入应该只在功能处于活动状态时才被传递.当然,我可以将该参数设置为可选参数,如下所示:

pub fn my_function(input1: usize, input2: String, input3: Option<Vec<u32>>) -> () {...}

但有没有一种方法可以使用功能标志并定义如下内容:

pub fn my_function(
    input1: usize,
    input2: String,
    #[cfg(feature = "my-feature")]
    input3: Vec<u32>
) -> () {...}

同样,后来又称其为:my_function(0, "", #[cfg(feature = "my-feature")] vec![0])

推荐答案

Rust的特性标志是对条件编译的简单包装.想象一下,如果该特性始终处于启用状态,那么您将如何编写代码,如果它始终处于禁用状态,您将如何编写代码,并用#[cfg(..])个表达式将两者之间的不同行包装起来.要定义不同的函数,可以定义两个不同的版本,如果它们几乎相同,则让它们调用共享内部块;如果它们应该做不同的事情,则只需分别定义它们:

struct Thing;

impl Thing {
    #[cfg(not(feature = "my-feature"))]
    pub fn my_function(input1: usize, input2: String) {
        Thing::my_function_inner(input1, input2, None);
    }

    #[cfg(feature = "my-feature")]
    pub fn my_function(input1: usize, input2: String, input3: Vec<u32>) {
        Thing::my_function_inner(input1, input2, Some(input3));
    }

    #[inline]
    fn my_function_inner(input1: usize, input2: String, input3: Option<Vec<u32>>) {
        todo!();
    }
}

要调用它,您可以依赖于始终启用/禁用功能标志并只使用相应的版本,或者您也可以包括这两个版本的代码,如下所示:

fn main() {
    #[cfg(not(feature = "my-feature"))]
    Thing::my_function(0, "".to_string());

    #[cfg(feature = "my-feature")]
    Thing::my_function(0, "".to_string(), vec![0]);
}

Rust相关问答推荐

如何找到一个数字在二维数组中的位置(S)?

如何计算迭代器适配器链中过滤的元素的数量

无法定义名为&new&的关联函数,该函数的第一个参数不是self

关于 map 闭合求和的问题

程序在频道RX上挂起

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

Rust从关联函数启动线程

减少指示ProgressBar在Rust中的开销

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

类型生命周期绑定的目的是什么?

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

可选包装枚举的反序列化

在1.5n次比较中找到整数向量中的最大和次大整数

如何在 Rust 中将 Vec> 转换为 Vec>?

如何从 x86_64 Mac 构建 M1 Mac?

如果我不想运行析构函数,如何移出具有析构函数的 struct ?

通用函数中的生命周期扣除和borrow (通用测试需要)

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

在 Rust 中组合特征的不同方法是否等效?

为移动和借位的所有组合实现 Add、Sub、Mul、Div