考虑来自 《Rust编程之书》 的以下示例:
据说(重点在于):函数签名现在告诉Rust,在某些生命周期
粗体句子难道不应该是这样吗:The function signature also tells Rust that the string slice returned from the function will live at most as long as lifetime
换句话说,如果
fn main() {
let string1 = String::from("abcd");
let string2 = "xyz";
let result = longest(string1.as_str(), string2);
println!("The longest string is {}", result);
}
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
据说(重点在于):函数签名现在告诉Rust,在某些生命周期
'a
中,该函数需要两个参数,都是字符串切片,并且它们的生命周期至少与生命周期'a
一样长。此外,函数签名还告诉Rust,从函数返回的字符串切片的生命周期至少与生命周期'a
一样长。 实际上,这意味着longest
函数返回的引用的生命周期与传入的引用的生命周期中较小的那个的生命周期相同。这些限制正是我们希望Rust强制执行的内容。粗体句子难道不应该是这样吗:The function signature also tells Rust that the string slice returned from the function will live at most as long as lifetime
'a
.?这样,只要x
和y
都存在,返回值就仍然有效,因为后者引用前者。换句话说,如果
x
、y
和返回值都至少与生命周期'a'
一样长,那么编译器可以简单地让'a'
成为一个空范围(任何项都可以超越),以满足限制条件,这使得注释毫无意义。这是没有意义的,对吧?
x
和y
的寿命,则不会有效。 - nalzokx
和y
仍然有效,调用者就可以放心地使用返回的值。 - Jmba < b
和a < c
并不能告诉我们关于b
和c
之间关系的任何信息,因此奇怪的是,生命周期注释可以从这个事实中建立链接,即参数和返回值都可以超过某个任意生命周期。 - nalzoklongest
函数不需要知道x
和y
的确切寿命,只需要知道可以替换为“'a”的某个作用域,以满足此签名。你认为这里的“某个作用域”应该是“所有作用域”吗? - nalzok