rust “warning:field `somebool` is never read”仅在第二个非trait impl中引用的结构体字段

6yjfywim  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(155)

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

$ 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中。

qhhrdooz

qhhrdooz1#

Rust会传递地考虑使用了什么。是的,字段是从ExampleStruct::play_here()读取的,但是 * 这个函数永远不会被调用。* 因为这个函数没有被调用,所以在决定程序中是否使用了其他东西时,它是无关紧要的。
这甚至适用于多个函数;如果你添加一个调用ExampleStruct::play_here()的非公共函数,但你没有在任何地方调用 that 函数,你仍然会得到一个警告; Rust确定整个调用链是死代码。
请注意,也有例外情况:

  • 任何声明为pub的东西都被认为是使用过的,因为这些东西被导出并且可以被其他crate使用(这主要是针对库crate的,但是即使在二进制crate中声明pub也会导致编译器认为它是“使用过的”)。
  • trait及其实现总是被认为是被使用的。(对于非公共trait或trait在非公共类型上的实现,这可能会在以后发生变化,其中实现从未被使用过。有a related open feature request。)

ExampleStruct::play_here()不属于这两类。

相关问题