https://github.com/rustcc/RustPrimer/blob/master/ownership-system/lifetime.md ## 隐式Lifetime 我们经常会遇到参数或者返回值为引用类型的函数: ```rust fn foo(x: &str) -> &str { x } ``` 上面函数在实际应用中并没有太多用处,`foo` 函数仅仅接受一个 `&str ` 类型的参数(`x`为对某个`string`类型资源`Something`的借用),并返回对资源`Something`的一个新的借用。 实际上,上面函数包含该了隐性的生命周期命名,这是由编译器自动推导的,相当于: ```rust fn foo<'a>(x: &'a str) -> &'a str { x } ``` 在这里,约束返回值的Lifetime必须大于或等于参数`x`的Lifetime。下面函数写法也是合法的: ```rust fn foo<'a>(x: &'a str) -> &'a str { "hello, world!" } ``` 为什么呢?这是因为字符串"hello, world!"的类型是`&'static str`,我们知道`static`类型的Lifetime是整个程序的运行周期,所以她比任意传入的参数的Lifetime`'a`都要长,即`'static >= 'a`满足。 这部分 `在这里,约束返回值的Lifetime必须大于或等于参数`x`的Lifetime` 是不是**说反了**? 而且"参数"和"返回值"的生命周期并没有关联性, 这里只是因为返回了参数`x`才有了联系, 容易误导. 而最后一个例子返回值与x无关, 不用考虑生命周期包含关系. 就算按错误思路考虑了也还是反的. 不过这节后面的手动指定lifetime时又纠正了... 另一个问题是仅靠"返回值依赖参数"就判断 "生命周期也有包含关系" 也不够严谨.
Activity