“警告:字段'somebool'永远不会被读取”,用于仅在第二个非特征 impl 中引用的结构字段

"warning: field `somebool` is never read" for struct field only referenced in second, non-trait impl

提问人:user3713271 提问时间:10/31/2023 最后编辑:John Kugelmanuser3713271 更新时间:10/31/2023 访问量:49

问:

这可能是我还不知道的功能。我有这个编译器消息:

$ 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

rust 编译器-warnings rust-cargo

评论

0赞 user3713271 10/31/2023
不好意思。如果结构是 pub,它就会消失。
0赞 cdhowie 10/31/2023
你的意思是如果字段是?pub

答:

3赞 cdhowie 10/31/2023 #1

Rust 考虑了传递使用的内容。是的,从中读取该字段,但从不调用此函数。由于未调用该函数,因此在决定是否使用程序中的其他任何内容时,它无关紧要。ExampleStruct::play_here()

这甚至适用于多种功能;如果添加一个调用但未在任何地方调用函数的非公共函数,则仍会收到警告;Rust 确定整个调用链都是死代码。ExampleStruct::play_here()

请注意,也有例外:

  • 任何声明的东西都被认为是二手的,因为这些东西是出口的,可以被其他板条箱使用。(这主要用于库 crate,但即使在二进制 crate 中声明某些内容也会导致编译器认为它“已使用”。pubpub
  • 特征及其实现始终被视为已使用。(对于非公共特征或从未使用过实现的非公共类型的特征实现,这可能会在以后更改。有一个相关的开放功能请求

ExampleStruct::play_here()不属于这些类别中的任何一个。