为什么 "borrowed value does not live long enough" 使用 Self 而不是特定类型?

Why "borrowed value does not live long enough" with Self but not specific type?

以下代码:

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

相比之下,如果我写相同的东西但使用固定类型 &[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);
    }
}

为什么第一个代码失败而第二个没有?是否可以更改第一个代码以使其编译?

因为生命周期省略。您的第一个示例(带有 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 的参数使用不同的生命周期。