Rust Cargo test在保存文件后警告未使用的代码
我开始掌握Rust模块,但在板条箱的Rust Cargo test在保存文件后警告未使用的代码,rust,compiler-warnings,rust-cargo,Rust,Compiler Warnings,Rust Cargo,我开始掌握Rust模块,但在板条箱的src目录中有以下内容。如果我做了一个小的修改(添加一些空格或重命名测试函数),保存并立即运行cargo test,我会收到一个未使用函数的警告,但是如果我等待几秒钟,然后再次运行它,它会在没有警告的情况下运行 lib.rs mod greet; #[test] pub fn it_greets_the_world_correctly() { assert_eq!("Hello, world!", greet::greet("world")); }
src
目录中有以下内容。如果我做了一个小的修改(添加一些空格或重命名测试函数),保存并立即运行cargo test
,我会收到一个未使用函数的警告,但是如果我等待几秒钟,然后再次运行它,它会在没有警告的情况下运行
lib.rs
mod greet;
#[test]
pub fn it_greets_the_world_correctly() {
assert_eq!("Hello, world!", greet::greet("world"));
}
pub fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
问候.rs
mod greet;
#[test]
pub fn it_greets_the_world_correctly() {
assert_eq!("Hello, world!", greet::greet("world"));
}
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怎么会认为函数在被明显调用时没有被使用,因为测试在两次测试中都通过。使用货物测试--verbose
会给你一些答案
首先,cargo test
将编译lib
和--板条箱类型lib
的所有内容。这就是导致您发出警告的原因<代码>问候语::问候语实际上并没有在库代码中调用
接下来,cargo test
将作为一个单独的步骤对库运行rustc--cratetype lib--test
。这个函数确实调用了greet::greet
,因此不会收到任何警告
现在,如果再次触摸文件并将测试更改为:
assert_eq!("Hello, world!", "Hello, world!");
你会注意到你收到了两个相同的警告。。。因为这两个步骤都没有引用greet::greet
函数(库没有调用它,测试也没有调用它)
我认为这是一个有效的警告,也是您想要的:警告是说您有一个未在库代码中调用的方法。。即使测试调用它。我认为,在一个较大的代码库中,您可能希望得到警告并清理您的测试,这些测试现在正在测试主代码库中未使用的函数。仔细检查输出:
$cargo测试
编译hello v0.1.0(file:///F:/workspace/hello_rust)
正在运行target\debug\hello-111b9369d8889475.exe
$cargo测试
正在运行target\debug\hello-111b9369d8889475.exe
第二次执行cargo test
时,代码没有任何变化。因为没有任何更改,所以不需要重新编译代码
编译器警告(如未使用的函数)仅在编译器运行时生成。如果编译器不运行,则不会出现任何警告
更改代码将触发重新编译
接下来的问题是,为什么它认为该函数未被使用?涵盖了这一点。即使函数标记为
pub
,它所在的模块也不是公共的。这意味着不可能在库之外调用函数。因为在库中没有对它的调用,所以它是未使用的