我下面的代码
trait Random {
fn generate() -> Self;
}
impl Random for &str {
// This compiles successfully
fn generate() -> Self {
"foo"
}
// This does not compile
//fn generate() -> &str {
// "foo"
//}
}
fn random<T>() -> T
where
T: Random,
{
T::generate()
}
fn main() {
let v: &str = random();
println!("you get {}", v);
}
我不明白为什么当我回来时
Self
它不抱怨expected named lifetime parameter
甚至Self
这里代表&str
据我了解,因为
Self
代表 &str
,所以我必须通过添加 'static
来指定其生命周期,但代码无需这样做即可成功编译
这不是特定于特征方法的。你也可以写:
fn generate <'a>() -> &'a str { "foo" }
generate
的类型是一个合约 - 给定任何生命周期'a
,它承诺为您提供一个str
引用,其生命周期至少与'a
一样长。文字满足这一点,因为文字的生命周期是 'static
,并且 'static
至少与任何其他生命周期一样长。
另请注意,实现特征方法的引用类型隐式绑定生命周期参数,因此您的特征实现与完全相同
impl <'a> Random for &'a str { ... }
签名
fn generate() -> Self
不会给你“预期的命名生命周期参数”错误,因为这里Self
确实有生命周期,即
... for &'a str
中绑定的引用类型的生命周期。