条件不稳定的 Rustc 特性?

3

如果当前的Rust编译器已经稳定,我需要在实验性功能上删除换行符。是否有可能做到这一点?

#![cfg_attr(rustversion::nightly, feature(type_name_of_val))]
2个回答

3

感谢Rust论坛,我已经找出解决问题的两种方法:

  • 通过在文件中声明自定义功能
  • 通过环境变量

如何通过在文件中声明自定义功能有条件地启用功能?

  1. 将特性声明到文件中。rustc不稳定特性将绑定到在文件中声明的特性上。例如:
[features]
nightly = []
default = [ "nightly" ]

我选择了名字为nightly,但这只是任意的。特性default描述了哪些功能是默认开启的。

  1. 在项目的根文件中有条件地开启rustc 特性:
#![ cfg_attr( feature = "nightly", feature( type_name_of_val ) ) ]

feature = "nightly"指向之前在文件中声明的功能。 feature( type_name_of_val ) - 声明此不稳定的rustc特性。 注意:应在整个可执行文件的根文件开头声明rustc不稳定特性。否则,您将收到以下错误信息:crate-level attribute should be in the root module。

  1. 有条件地使用不稳定的rustc特性:
#[ cfg( feature = "nightly" ) ]
println!( "{} is {}", i, std::any::type_name_of_val( &i ) );

#[ cfg(feature = "nightly") ] 会告诉编译器,如果自定义特性 nightly 被禁用,则删除相关联的行。在我们的情况下,特性 nightlycargo 文件 default = ["nightly"] 中默认开启。

如何使用环境变量 RUSTFLAGS 条件地启用 rustc 特性?

  1. 在项目的根文件中条件性地打开 rustc 特性:
#![ cfg_attr( nightly, feature( type_name_of_val ) ) ]

nightly 指的是 Rust 编译器的夜间版本,可通过 --cfg 标志 进行引用。 feature(type_name_of_val) - 声明使用了这个不稳定的 rustc 特性。 注意:应在整个可执行文件的开始处声明 rustc 不稳定特性。否则,将会出现 crate-level attribute should be in the root module。

  1. 有条件地使用不稳定的 rustc 特性:
#[ cfg( nightly ) ]
println!( "{} is {}", i, std::any::type_name_of_val( &i ) );

#[ cfg( nightly ) ]用于告诉编译器,如果rustc没有得到cfg nightly,则删除相关的代码行。我们接下来会通过环境变量RUSTFLAGS来传递它。

  1. 使用环境变量RUSTFLAGS运行可执行文件。
RUSTFLAGS="--cfg nightly" cargo run

环境变量RUSTFLAGS="--cfg nightly"告诉 Cargo 将参数--cfg nightly传递给编译器。

解决方法


1

1
谢谢,但那也不行。 - Kos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接