Avatar ·

为什么在Rust中需要显式指定生命周期(lifetimes),以及它们是如何工作的?

我是Rust新手,正在尝试理解生命周期(lifetimes)的概念。我写了一个简单的函数,返回数组元素的引用: ```rust fn get_first_element(arr: &[i32]) -> &i32 { &arr[0] } ``` 编译器编译时没有出现问题。但当我尝试编写一个接受两个引用并返回其中一个的函数时: ```rust fn longest(x: &str, y: &str) -> &str { if x.len() > y.len() { x } else { y } } ``` 却遇到了错误:"missing lifetime specifier"。为什么在第一种情况下编译器能自行处理,而在第二种情况下却要求显式指定lifetime?我以为Rust很智能,可以自动推断一切。 我理解生命周期是为了防止悬垂引用,但我不明白为什么有些情况下可以推断,而有些情况下却不能。请通过示例解释一下,什么时候需要显式指定lifetime,什么时候可以省略。我特别想知道为什么在只有一个参数的简单函数中...