这可能是我还不知道的功能。我有这样的编译器消息:
$ cargo build --lib
Compiling secondimpl v0.1.0 (/home/nsdd/garage/sames/rustex/secondimpl)
warning: field `somebool` is never read
--> src/lib.rs:6:5
|
5 | pub struct ExampleStruct {
| ------------- field in this struct
6 | somebool: bool,
| ^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: associated function `playhere` is never used
--> src/lib.rs:31:8
|
31 | fn playhere(&self) -> usize {
| ^^^^^^^^
warning: `secondimpl` (lib) generated 2 warnings
Finished dev [unoptimized + debuginfo] target(s) in 0.16s
这是我的示例代码:
pub trait ExampleTrait {
fn new(mynum: usize) -> Self;
}
pub struct ExampleStruct {
somebool: bool,
somenum: usize,
}
impl Default for ExampleStruct {
fn default() -> Self {
ExampleStruct {
somebool: true,
somenum: 999,
}
}
}
impl ExampleTrait for ExampleStruct {
fn new(mynum: usize) -> Self {
let mut buffer: ExampleStruct = Default::default();
buffer.somenum = mynum;
return buffer;
}
}
impl ExampleStruct {
fn playhere(&self) -> usize {
if self.somebool {
return self.somenum;
}
return 0;
}
}
所以因为我只在第二个实现中使用
self.somenum
,所以编译器似乎不喜欢它。据推测,我可以进行一些声明或语法更改来阻止此警告,因为这显然是一个没有考虑第二个实现的问题。该字段是其他特质中不会出现的东西,所以我不能把它放在特质中。
Rust 考虑传递性地使用什么。是的,该字段是从
ExampleStruct::play_here()
读取的,但是 这个函数永远不会被调用。 因为该函数没有被调用,所以在决定是否使用程序中的其他内容时它是无关紧要的。
这甚至适用于多种功能;如果您添加一个调用
ExampleStruct::play_here()
的非公共函数,但没有在任何地方调用 that 函数,您仍然会收到警告; Rust 确定整个调用链都是死代码。
请注意,也有例外:
pub
的东西都被视为已使用,因为这些东西被导出并且 可以 被其他箱子使用。 (这主要用于库 crate,但是即使在二进制 crate 中声明某些内容也会导致编译器认为它是“已使用”。)Traits 及其实现始终被视为已使用。 (对于非公共特征或非公共类型上的特征实现,这可能会在以后发生变化,而这些实现永远不会被使用。有pub
不属于这些类别中的任何一个。