【问题标题】:Why "borrowed value does not live long enough" with Self but not specific type?为什么使用 Self 而不是特定类型的“借来的价值活得不够长”?
【发布时间】:2021-12-26 09:08:14
【问题描述】:

以下代码:

trait Passable: Sized {
    fn call<F: Fn(Self)>(f: F);
}

impl Passable for &[i32] {
    fn call<F: Fn(Self)>(f: F) {
        let vec = vec![1, 2, 3];
        f(&vec);
    }
}

给出错误

error[E0597]: `vec` does not live long enough
 --> src/main.rs:8:11
  |
8 |         f(&vec);
  |           ^^^^ borrowed value does not live long enough
9 |     }
  |     - `vec` dropped here while still borrowed

相比之下,如果我编写相同的东西,但使用固定类型 &amp;[i32] 而不是 Self,它会编译:

trait Passable: Sized {
    fn call<F: Fn(&[i32])>(f: F);
}

impl Passable for &[i32] {
    fn call<F: Fn(&[i32])>(f: F) {
        let vec = vec![1, 2, 3];
        f(&vec);
    }
}

为什么第一个代码失败而第二个代码失败?并且可以更改第一个代码以使其编译吗?

【问题讨论】:

    标签: rust borrow-checker


    【解决方案1】:

    因为终身省略。您的第一个示例(使用Self)等效于以下代码:

    trait Passable: Sized {
        fn call<F: Fn(Self)>(f: F);
    }
    
    impl<'a> Passable for &'a [i32] {
        fn call<F: Fn(&'a [i32])>(f: F) {
            let vec = vec![1, 2, 3];
            f(&vec);
        }
    }
    

    请注意,这里f 接受一个参数的生命周期Self 相同,但vec 的生命周期较短。

    另一方面,您的第二个示例等效于以下代码:

    trait Passable: Sized {
        fn call<'b, F: Fn(&'b [i32])>(f: F);
    }
    
    impl<'a> Passable for &'a [i32] {
        fn call<'b, F: Fn(&'b [i32])>(f: F) {
            let vec = vec![1, 2, 3];
            f(&vec);
        }
    }
    

    它对Selff 的参数使用不同的生命周期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 2020-07-23
      • 2019-11-29
      • 1970-01-01
      相关资源
      最近更新 更多