rust - Rust 编程语言中关于生命周期的问题
问题描述
为什么在此图中 'a 在 'b 之前结束?他们不应该在花括号的末尾同时结束吗?
这是“The Rust Programming Language”一书中的清单 10-19 ( https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html )
解决方案
在这里,生命周期'a
和'b
do 都在花括号的末尾结束。它们都是在同一范围内创建和销毁的,因为它们都没有被移动,所以在这种情况下你是正确的。出于我们的目的,它们同时结束。但是,'a
显示结束之前的原因'b
与 Rust 借用检查器如何处理引用有关,并在同一本 Rust 编程语言书的清单 10-18中进行了解释:
// Listing 10-18
{
let r; // ---------+-- 'a
// |
{ // |
let x = 5; // -+-- 'b |
r = &x; // | |
} // -+ |
// |
println!("r: {}", r); // |
} // ---------+
Rust 借用检查器拒绝上述代码段,因为引用&x
比值x
本身寿命长,这会导致问题。书中将其解释为:
程序被拒绝,因为 'b 比 'a 短:参考的主题没有参考的寿命。
这个很重要。牢记这个概念,让我们再次阅读您的代码段:
// Listing 10-19
{
let x = 5; // ----------+-- 'b
// |
let r = &x; // --+-- 'a |
// | |
println!("r: {}", r); // | |
// --+ |
} // ----------+
借用检查器必须能够保证引用不会超过它所引用的值。因此,引用的生命周期必须比值本身的生命周期短。在您的代码片段中,引用的生命周期'a
显示为在值的生命周期之前结束,'b
因为从概念上讲,引用的存在时间不得长于值。
推荐阅读
- elasticsearch - 如何在elasticsearch中获取空字段?
- amazon-web-services - 删除对应用程序 CNAME 的访问权限,只允许访问重新路由的域
- c# - 带有 MySQL 的实体框架:ToList() 非常慢
- r - 基于列名模式的多个成对差异
- python - 在多维数组上使用 numpy where
- django - Django过滤多对多关系
- material-ui - React-admin MenuItemLink onClick 不起作用
- android - 在 Kotlin 中自动扩展 searchView
- jekyll - 如何在markdown(使用jekyll主题)文件中为git-bash代码应用语法突出显示?
- pdf - Aspose - 自动表格调整大小,适合页面中的问题