我正在从这本Rust 的书中了解生命.

一个简单的问题,

以下代码给出了一个正确的预期错误:

fn check_check() {
    let r; 
    {
        let s = String::from("s");
        r = check(&s); // says s does not live long enough
    }
    println!("{}", r);
}

fn check<'a>(s: &'a str) -> &'a str {
    return s;
}

这是因为我已经提到了check函数中的生存期与参数相同.所以这很好,我理解这一点.

按照同样的逻辑,当我编写这段代码时,它不会给出任何错误.

这是我不明白的,这是怎么编译的?

fn check_check() {
    let r; 
    {
        let s = "a";
        r = check(&s); // works just fine, why? and how?
    }
    println!("{}", r);
}

fn check<'a>(s: &'a str) -> &'a str {
    return s;
}

推荐答案

在我们询问生存期之前,这里有一个关于类型的问题:字符串文字的类型是&'static str,当你引用它时,你得到&&'static str(两个引用),那么你如何将它传递给一个期望&str(一个引用)的函数?

答案是,当将参数传递给函数时,编译器可能会进行强制调整;可能的调整之一是deref强制,它取消对传递的值的引用.所以我们取&&'static str并取消对它的引用,得到&'static str.

这也是你问题的答案:既然我们超过了&'static str,'a就是'static,所以它确实活得足够长了.

Rust相关问答推荐

trait声明中的生命周期参数

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

定义采用更高级类型泛型的性状

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

获取与父字符串相关的&;str的原始片段

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

try 实现线程安全的缓存

仅发布工作区的二进制 crate

使用 Option 来分配?

如何为整数切片定义一个带有额外函数的特性别名?

Rust 异步循环函数阻塞了其他future 任务的执行

max(ctz(x), ctz(y)) 有更快的算法吗?

为什么不可变特征的实现可以是可变的?

从嵌入式 Rust 中的某个时刻开始经过的时间

如何使用泛型满足 tokio 异步任务中的生命周期界限

没有通用参数的通用返回

相互调用的递归异步函数:检测到循环

如何迭代调用可能会失败的函数?操作员?

有没有比多个 push_str() 调用更好的方法将字符串链接在一起?

Rust String AsRef 不会自动borrow [u8]