我在里面指定了一些功能Cargo.toml:
[features]
complex = []
simple = []
Run Code Online (Sandbox Code Playgroud)
当我构建项目时,我使用cargo build --features="complex"或simple.
在某些函数中,我想根据使用的功能返回一个值:
fn test() -> u32 {
let x: u32 = 3;
if cfg!(feature = "complex") {
let y: u32 = 2;
x + y
}
if cfg!(feature = "simple") {
let y: u32 = 1;
x + y
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它试图评估两个表达式。在我的情况下使用cfg!宏的正确方法是什么?
状态的cfg!文档:
配置标志的布尔评估。
这意味着cfg!(...)被替换为布尔值 ( true/ false)。扩展后,您的代码将如下所示:
fn test() -> u32 {
let x = 3;
if true {
let y = 2;
x + y
}
if true {
let y = 1;
x + y
}
}
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是添加一个else:
fn test() -> u32 {
let x = 3;
if cfg!(feature = "complex") {
let y = 2;
x + y
} else {
let y = 1;
x + y
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用 的属性形式cfg。在这种情况下,该属性可以阻止整个下一个表达式被编译:
fn test() -> u32 {
let x: u32 = 3;
#[cfg(feature = "complex")]
{
let y: u32 = 2;
x + y
}
#[cfg(feature = "simple")]
{
let y: u32 = 1;
x + y
}
}
Run Code Online (Sandbox Code Playgroud)
因为它尝试评估两个表达式。
不,事实并非如此。评估发生在运行时,并且该代码甚至无法编译。
也可以看看:
| 归档时间: |
|
| 查看次数: |
6228 次 |
| 最近记录: |