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

问题描述 投票:0回答:1

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

$ 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 compiler-warnings rust-cargo
1个回答
1
投票

Rust 考虑传递性地使用什么。是的,该字段是从

ExampleStruct::play_here()
读取的,但是 这个函数永远不会被调用。 因为该函数没有被调用,所以在决定是否使用程序中的其他内容时它是无关紧要的。

这甚至适用于多种功能;如果您添加一个调用

ExampleStruct::play_here()
的非公共函数,但没有在任何地方调用 that 函数,您仍然会收到警告; Rust 确定整个调用链都是死代码。

请注意,也有例外:

  • 任何声明为
    pub
    的东西都被视为已使用,因为这些东西被导出并且 可以 被其他箱子使用。 (这主要用于库 crate,但是即使在二进制 crate 中声明某些内容也会导致编译器认为它是“已使用”。)
    Traits 及其实现始终被视为已使用。 (对于非公共特征或非公共类型上的特征实现,这可能会在以后发生变化,而这些实现永远不会被使用。有
  • 相关的开放功能请求
  • 。)
pub

不属于这些类别中的任何一个。

    

© www.soinside.com 2019 - 2024. All rights reserved.