为什么rust会抱怨一个未使用的函数,当它只在测试中使用时?
当一个函数只从测试中调用时,rust 会抱怨它从未被使用过。为什么会发生这种情况以及如何解决这个问题?
例子:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=52d8368dc5f30cf6e16184fcbdc372dc
fn greet() {
println!("Hello!")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_greet() {
greet();
}
}
我收到以下编译器警告:
Compiling playground v0.0.1 (/playground)
warning: function is never used: `greet`
--> src/lib.rs:1:4
|
1 | fn greet() {
| ^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: 1 warning emitted
回答
在 rust fn 中默认是私有的。greet() 在你的模块之外是不可访问的。如果除了测试之外没有在其中使用 greet(),那么 rust 会正确地将其标记为死代码。
如果greet() 应该是您公共接口的一部分,请将其标记为pub:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8a8c50b97fe3f1eb72a01a6252e9bfe6
pub fn greet() {
println!("Hello!")
}
如果greet() 是一个仅在测试中使用的助手,将其移动到mod 测试中:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3dc51a36b4d5403ca655dec0210e4098
#[cfg(test)]
mod tests {
fn greet() {
println!("Hello!")
}
#[test]
fn test_greet() {
greet();
}
}