为什么要返回Rust中存在的&str编译成功的Self

问题描述 投票:0回答:1

我下面的代码

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
来指定其生命周期,但代码无需这样做即可成功编译

rust lifetime
1个回答
0
投票

这不是特定于特征方法的。你也可以写:

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
中绑定的引用类型的生命周期。

© www.soinside.com 2019 - 2024. All rights reserved.