这可能是一个我还不知道的功能。我有这个编译器消息:
$ 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;
}
}
型
因为我只在第二个impl中使用了self.somenum
,所以编译器似乎不喜欢它。大概我可以做一些声明或语法更改来阻止这个警告,因为这显然是一个没有考虑第二个impl的问题。该字段不会出现在其他trait中,所以我不能把它放在trait中。
1条答案
按热度按时间qhhrdooz1#
Rust会传递地考虑使用了什么。是的,字段是从
ExampleStruct::play_here()
读取的,但是 * 这个函数永远不会被调用。* 因为这个函数没有被调用,所以在决定程序中是否使用了其他东西时,它是无关紧要的。这甚至适用于多个函数;如果你添加一个调用
ExampleStruct::play_here()
的非公共函数,但你没有在任何地方调用 that 函数,你仍然会得到一个警告; Rust确定整个调用链是死代码。请注意,也有例外情况:
pub
的东西都被认为是使用过的,因为这些东西被导出并且可以被其他crate使用(这主要是针对库crate的,但是即使在二进制crate中声明pub
也会导致编译器认为它是“使用过的”)。ExampleStruct::play_here()
不属于这两类。