rust - 如何计算函数的输出寿命?
问题描述
在 Rust 书(https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html)中,此代码用作示例(释义):
fn main() {
let string1 = String::from("long string is long");
{
let string2 = String::from("xyz");
let result = longest(string1.as_str(), string2.as_str()); // line 5
println!("The longest string is {}", result); // line 6
}
}
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
我很困惑为什么这段代码可以编译。
关于longest
函数,书中说,“通用生命周期 'a 将获得等于 x 和 y 生命周期中较小者的具体生命周期”。
这本书然后说话好像string1.as_str()
和string2.as_str()
寿命一样长string1
和string2
分别。但他们为什么会呢?这两个引用在第 5 行之后没有使用,到了第 6 行,它们应该已经死了。为什么在第 6 行使用不再存在的结果时没有错误?
有人可以说存在以result
某种方式延长了输入寿命,但这不会与“输出寿命是输入寿命的交集”的概念相矛盾吗?
我在哪里弄错了?
解决方案
但他们为什么会呢?这两个引用在第 5 行之后没有使用,到了第 6 行,它们应该已经死了。
但他们并没有死。事实上,其中一个肯定在result
第 6 行中并且正在使用。引用至少可以持续到当前表达式的结尾(通常,但不总是,直到分号),最长只要它指向的东西继续存在。的输出中的生命周期参数要求它在范围内longest
持续。result
值得注意的是, 的范围result
不大于string1
or的范围string2
,所以没有问题。如果我们试图将 的结果分配longest
给一个超过 的变量string2
,那么我们就会遇到问题。例如,这不会编译。
fn main() {
let string1 = String::from("long string is long");
let mut result = "";
{
let string2 = String::from("xyz");
result = longest(string1.as_str(), string2.as_str());
}
println!("The longest string is {}", result);
}
因为那将需要result
寿命string2
,这是一个问题。
推荐阅读
- python - 如何使用 TTL 将 MongoDB 中的各个字段设置为在一定时间后过期,而不是整个文档?
- python - 一些 Tkinter create_line 命令不绘制垂直线,但其他命令
- scikit-learn - 在 scikit-learn 中使用 GridSearchCV 会导致 CalibratedClassifierCV 出现错误。GridSearchCV 对象没有属性 'best_params_
- hive - Apache Beam SqlTransforms 架构问题
- laravel-5.6 - 在 laravel 上创建第一个数据库表的问题
- laravel - laravel 中的单页
- python - 根据条件更改多维numpy数组值
- node.js - 带有节点 js 的 AWS RDS:错误:在参数中找到意外的键“DeleteProtection”
- angular - Angular 4+ - 如何从输入日期选择器中获取日期
- ios - 访问 Node Express 端点时,URLSession.shared.dataTask 数据始终为空