提问人:user3713271 提问时间:10/31/2023 最后编辑:John Kugelmanuser3713271 更新时间:10/31/2023 访问量:49
“警告:字段'somebool'永远不会被读取”,用于仅在第二个非特征 impl 中引用的结构字段
"warning: field `somebool` is never read" for struct field only referenced in second, non-trait impl
问:
这可能是我还不知道的功能。我有这个编译器消息:
$ 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
答:
3赞
cdhowie
10/31/2023
#1
Rust 考虑了传递使用的内容。是的,从中读取该字段,但从不调用此函数。由于未调用该函数,因此在决定是否使用程序中的其他任何内容时,它无关紧要。ExampleStruct::play_here()
这甚至适用于多种功能;如果添加一个调用但未在任何地方调用该函数的非公共函数,则仍会收到警告;Rust 确定整个调用链都是死代码。ExampleStruct::play_here()
请注意,也有例外:
- 任何声明的东西都被认为是二手的,因为这些东西是出口的,可以被其他板条箱使用。(这主要用于库 crate,但即使在二进制 crate 中声明某些内容也会导致编译器认为它“已使用”。
pub
pub
- 特征及其实现始终被视为已使用。(对于非公共特征或从未使用过实现的非公共类型的特征实现,这可能会在以后更改。有一个相关的开放功能请求。
ExampleStruct::play_here()
不属于这些类别中的任何一个。
评论
pub