如何在不使用构建脚本的情况下仅为特定的Rust版本添加代码?

时间:2017-01-24 22:49:16

标签: rust

我使用Rust 1.10中出现的方法进行测试,但我希望我的箱子也适用于1.7版本。

是否有一种方法(类似于属性#[cfg(min_version="1.10")])来指定只应在Rust 1.10或更新版本中运行的代码?

我可以使用构建脚本,但我不想要更复杂的构建,因为我想在较旧的Rust版本上测试我的箱子。

1 个答案:

答案 0 :(得分:1)

虽然除了构建脚本(以及将来的过程宏)之外没有办法检查编译器版本,但您可以使用功能标志来手动启用和禁用代码。

通常,您希望使用一些新的编译器功能来提供旧的编译器无法实现的新功能。在这种情况下,您使用cfg属性和您定义的功能标志来启用代码。 E.g。

#[cfg(feature = "foo")]
pub fn foo() {
    cool_new_compiler_function();
}

在您的Cargo.toml

[features]
foo = []

隐藏此类功能标记后面的代码也适用于测试代码。在您的特定情况下,您可以使用现代代码来交替引入legacy功能并禁用测试:

#[test]
#[cfg(not(feature = "legacy"))]
fn test_foo() {
    Foo::foo();
}

然后在遗留模式下运行测试:

cargo test --features "legacy"

请注意,以后一种方式执行操作意味着您的测试默认情况下不会在较旧的编译器上编译。对于普通(非测试)代码,添加这样的遗留标志将是一个非常糟糕的,突破性的变化。