Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust Cargo test在保存文件后警告未使用的代码_Rust_Compiler Warnings_Rust Cargo - Fatal编程技术网

Rust Cargo test在保存文件后警告未使用的代码

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")); }

我开始掌握Rust模块,但在板条箱的
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
,它所在的模块也不是公共的。这意味着不可能在库之外调用函数。因为在库中没有对它的调用,所以它是未使用的