保存文件

时间:2016-06-16 02:17:47

标签: rust compiler-warnings rust-cargo

我开始掌握Rust模块,但我在crate的src目录中有以下内容。如果我做了一个小修改(添加一些空格或重命名测试函数),保存然后立即运行cargo test我收到一个未使用函数的警告,但如果我等待几秒钟,然后再次运行它,它在没有任何警告的情况下运行。

lib.rs

mod greet;

#[test]
pub fn it_greets_the_world_correctly() {
    assert_eq!("Hello, world!", greet::greet("world"));
}

greet.rs

pub fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

但是当我运行cargo test时,我得到以下内容:

$ cargo test
   Compiling hello v0.1.0 (file:///F:/workspace/hello_rust)
src\greet.rs:1:1: 3:2 warning: function is never used: `greet`, #[warn(dead_code)] on by default
src\greet.rs:1 pub fn greet (name: &str) -> String {
src\greet.rs:2   format!("Hello, {}!", name)
src\greet.rs:3 }
     Running target\debug\hello-111b9369d8889475.exe

running 1 test
test it_greets_the_world_correctly ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

   Doc-tests hello

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured

然后几秒钟......

$ cargo test
     Running target\debug\hello-111b9369d8889475.exe

running 1 test
test it_greets_the_world_correctly ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

   Doc-tests hello

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured

我对抑制警告并不感兴趣,我很好奇Rust可能会认为该函数在显然被调用时没有被使用,因为测试在两次运行中都没有通过测试。

2 个答案:

答案 0 :(得分:2)

使用cargo test --verbose会给你一些答案。

首先,cargo test将使用lib编译--crate-type lib的所有内容。这是导致你警告的原因。实际上并未在您的库代码中调用greet::greet

接下来,cargo test将针对库运行rustc --crate-type lib --test作为单独的步骤。这个调用greet::greet,因此您不会收到任何警告。

现在,如果再次触摸文件并将测试更改为:

assert_eq!("Hello, world!", "Hello, world!");

您会注意到同样的事情会收到两个警告...因为这两个步骤都没有引用greet::greet功能(图书馆没有调用它...而且测试不称之为。)

我认为这是一个有效的警告,是你想要的:警告说你有一个方法在你的库代码中没有被调用..即使测试调用它。我认为,在更大的代码库中,您需要收到警告并清理您现在正在测试主代码库中未使用的函数的测试。

答案 1 :(得分:1)

仔细检查输出:

spark-submit
$ cargo test
   Compiling hello v0.1.0 (file:///F:/workspace/hello_rust)
     Running target\debug\hello-111b9369d8889475.exe

第二次执行$ cargo test Running target\debug\hello-111b9369d8889475.exe 时,代码没有任何变化。因为没有任何改变,所以代码不需要重新编译。

编译器警告(如未使用的函数)仅在编译器运行时生成。如果编译器没有运行,则不会有任何警告。

更改代码将触发重新编译。

后续问题是,为什么认为该功能未被使用? Simon Whitehead's answer涵盖了这一点。即使该功能标记为cargo test,其所在的模块也不公开。这意味着无法在库外调用该函数。由于库内没有调用它,因此未使用它。