人生的第三条法则是:
如果有多个输入生命周期参数,但其中一个是
&self或&mut self,因为这是一个方法,那么self的生存期被分配给所有输出生命周期参数。这使得写作方法更好。
下面是描述这个函数所发生的事情的教程
fn announce_and_return_part(&self, announcement: &str) -> &str有两个输入生命周期,因此Rust应用了第一个生命周期省略规则,并给出了
&self和announcement各自的生命周期。然后,因为其中一个参数是&self,所以返回类型将获得&self的生存期,并且所有的生命周期都已计算在内。
我们可以表明,所有的生命周期都没有计算在内,因为announcement的生命周期可能与&self不同。
struct ImportantExcerpt<'a> {
part: &'a str,
}
impl<'a> ImportantExcerpt<'a> {
fn announce_and_return_part(&self, announcement: &str) -> &str {
println!("Attention please: {}", announcement);
announcement
}
}
fn main() {
let i = ImportantExcerpt { part: "IAOJSDI" };
let test_string_lifetime;
{
let a = String::from("xyz");
test_string_lifetime = i.announce_and_return_part(a.as_str());
}
println!("{:?}", test_string_lifetime);
}announcement的生存期不像&self那么长,所以将输出生存期与&self相关联是不正确的,难道不应该将输出生存期与输入的长度关联起来吗?
为什么生命周期省略的第三条规则是分配输出生存期的有效方法?
发布于 2017-09-20 23:41:37
不,省略规则并不能涵盖每一种可能的情况。如果是这样,那么就不会有任何省略规则,它们将是唯一的规则,并且我们不需要任何语法来指定显式的生存期。
引用你所链接的文件,强调我的:
在Rust对参考文献的分析中编程的模式称为生命周期省略规则。这些规则不是程序员需要遵循的规则;这些规则是编译器将考虑的一组特殊情况,如果您的代码适合这些情况,则不需要显式地编写生命周期。 省略规则没有提供充分的推断:如果Rust决定性地应用了这些规则,但是对于引用的生存期仍然不明确,它不会猜测剩下的引用的生存期应该是。在这种情况下,编译器将提供一个错误,可以通过添加与您的意图相对应的生存期注释来解决该错误。
announcement的生存期不如&self长,因此将输出生存期与&self相关联是不正确的。 为什么生命周期省略的第三条规则是分配输出生存期的有效方法?
“正确”可能不是这里使用的正确词。省略规则所做的是是一种有效的方式,它并不是您想要的。
不应该将输出生存期与输入的长度关联起来吗?
是的,对于这个例子来说,这是可以接受的,只是这不是最常见的情况,所以这不是省略规则的目的。
另请参阅:
https://stackoverflow.com/questions/46333242
复制相似问题