代码之家  ›  专栏  ›  技术社区  ›  Tim Diekmann suresh madaparthi

“single\u use\u lifetimes”在函数中带有派生的结构上是什么意思?如何解决它?

  •  2
  • Tim Diekmann suresh madaparthi  · 技术社区  · 6 年前
    #![warn(single_use_lifetimes)]
    
    fn do_foo() {
        #[derive(Debug)]
        struct Foo<'a> {
            bar: &'a u32,
        }
    }
    

    warning: lifetime parameter `'a` only used once
     --> src/lib.rs:6:16
      |
    6 |     struct Foo<'a> {
      |                ^^
      |
    

    playground

    这个警告是什么意思?这个问题怎么解决?

    忽略派生或函数时,不会显示此警告。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Shepmaster Tim Diekmann    6 年前

    这样做的目的是防止出现这样的代码,因为明确指定生存期是毫无意义的:

    pub fn example<'a>(_val: SomeType<'a>) {}
    

    相反,它更倾向于使用 '_ :

    pub fn example(_val: SomeType<'_>) {}
    

    expand your code 把它剪下来,你会发现:

    use std::fmt;
    
    struct Foo<'a> {
        bar: &'a u32,
    }
    
    impl<'a> fmt::Debug for Foo<'a> {
        fn fmt(&self, _f: &mut fmt::Formatter) -> fmt::Result { Ok(()) }
    }
    
    warning: lifetime parameter `'a` only used once
     --> src/lib.rs:9:6
      |
    9 | impl<'a> fmt::Debug for Foo<'a> {
      |      ^^
      |
    

    也就是说 <'a> 不需要,但是派生还是添加了它(因为自动生成代码很困难)。

    我真的不知道这里的代码会变成什么,因为你不能使用 '_

    这个问题怎么解决?

    我不知道它能不能,不重写 derive 实施 Debug .