< 返回版块

cuishuang 发表于 2024-01-04 17:17

Rust中部分场景需要显式标注生命周期,如果标注有误(比如我标注'a: 'b,但实际上 'a 的生命周期比 'b 短),会编译出错。

那编译器既然能够识别,为什么还需要使用者显式标注? 为了节省时间和资源吗?

还是说,100种可能中有3种情况 可以编译成功,编译器只能获知某种情况最后是否成功,而无法判断出成功时用到的到底是这三种中的哪一种?

评论区

写评论
全称量词 2024-04-09 01:15

对,有本事上 reddit 的 rust 子版块叫唤,或者上官方论坛,别来祸害 rustcc 了,你英语不挺 NB 吗?别写中文了。

--
👇
全称量词是儿子: 对,翻译比较适合你,非常适合,英语都没理清楚,我还以为你多有能耐呢,还瞧不起专科生,专科生的英语都比你的好啦,口气挺大,内涵破陋不堪,有什么资格在这指手画脚,搞笑

--
👇
全称量词: > 类似于当因为有多种可能类型的时候必须注明类型,也会出现引用的生命周期以一些不同方式相关联的情况,所以 Rust 需要我们使用泛型生命周期参数来注明它们的关系,这样就能确保运行时实际使用的引用绝对是有效的。

Rust 程序设计语言 简体中文版 - 使用生命周期来确保引用有效

ankoGo 2024-04-09 00:51

对,翻译比较适合你,非常适合,英语都没理清楚,我还以为你多有能耐呢,还瞧不起专科生,专科生的英语都比你的好啦,口气挺大,内涵破陋不堪,有什么资格在这指手画脚,搞笑

--
👇
全称量词: > 类似于当因为有多种可能类型的时候必须注明类型,也会出现引用的生命周期以一些不同方式相关联的情况,所以 Rust 需要我们使用泛型生命周期参数来注明它们的关系,这样就能确保运行时实际使用的引用绝对是有效的。

Rust 程序设计语言 简体中文版 - 使用生命周期来确保引用有效

lengyijun 2024-01-07 09:00

因为 unsafe 块的 lifetime 无法推导

可以看这篇论文 Yuga: Automatically Detecting Lifetime Annotation Bugs in the Rust Language

JasonkayZK 2024-01-04 21:07

只看 longest 函数,看不出来你要返回的是哪个引用:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

fn main() {
  let x = String::from("x1");
  let y = String::from("y");
  let res = longest(&x, &y);
  println!("{}", res);
}

把返回值改成 'static

fn longest<'a>(x: &'a str, y: &'a str) -> &'static str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

会报错:

error: lifetime may not live long enough
 --> examples/main.rs:3:9
  |
1 | fn longest<'a>(x: &'a str, y: &'a str) -> &'static str {
  |            -- lifetime `'a` defined here
2 |     if x.len() > y.len() {
3 |         x
  |         ^ returning this value requires that `'a` must outlive `'static`

你显式标注的生命周期是为了告诉编译器你写的这个函数要求传入或者返回的引用类型是什么样的。

大部分情况下,编译器都会理解你函数中引用的意思,所以你不需要标注了。

全称量词 2024-01-04 18:01

类似于当因为有多种可能类型的时候必须注明类型,也会出现引用的生命周期以一些不同方式相关联的情况,所以 Rust 需要我们使用泛型生命周期参数来注明它们的关系,这样就能确保运行时实际使用的引用绝对是有效的。

Rust 程序设计语言 简体中文版 - 使用生命周期来确保引用有效

1 共 5 条评论, 1 页