Rust 当返回消费标准输入锁的结果时,为什么保留借出标准输入锁?
鉴于以下功能:Rust 当返回消费标准输入锁的结果时,为什么保留借出标准输入锁?,rust,lifetime,Rust,Lifetime,鉴于以下功能: use std::io::{BufRead, stdin}; fn foo() -> usize { let stdin = stdin(); let stdinlock = stdin.lock(); stdinlock .lines() .count() } 编译失败,出现以下错误: 错误:`stdin`寿命不够长 -->src/main.rs:12:1 | 7 |设stdinlock=stdin.lock()
use std::io::{BufRead, stdin};
fn foo() -> usize {
let stdin = stdin();
let stdinlock = stdin.lock();
stdinlock
.lines()
.count()
}
编译失败,出现以下错误:
错误:`stdin`寿命不够长
-->src/main.rs:12:1
|
7 |设stdinlock=stdin.lock();
|----借用发生在这里
...
11 | }
|^`stdin`在借来的时候掉在这里了
|
=注意:范围中的值按与创建顺序相反的顺序删除
我觉得这很奇怪,因为使用锁的结果(通过行
)没有保留对原始源的任何引用。事实上,在返回之前将相同的结果分配给绑定就可以了()
这表明,立即返回“已使用的锁”会导致锁试图比锁定的内容活得更长,这是一种不同寻常的方式。我研究的所有引用通常都指出声明的顺序很重要,但返回的对象如何影响它们的释放顺序并不重要
那么为什么编译器会拒绝前一个函数呢?为什么锁的保留时间似乎比预期的长?这似乎是编译器中的一个错误。您可以使用显式的
return
语句使编译器满意:
use std::io::{stdin, BufRead};
fn foo() -> usize {
let stdin = stdin();
let stdinlock = stdin.lock();
return stdinlock
.lines()
.count();
}
fn main() {}
如评论中所述,存在多个与此相关的锈蚀问题:
#![feature(nll)]
use std::io::{BufRead, stdin};
fn foo() -> usize {
let stdin = stdin();
let stdinlock = stdin.lock();
stdinlock
.lines()
.count()
}
11.25.0-每晚(2018-01-11 73ac5d6)Oh。有趣!有人提出过错误报告吗?@Veedrac:我并不知道,我一直在寻找解释,因为经验一再证明,借阅检查程序比我的直觉更可靠。再说一次,在这种情况下,看起来越来越有可能有可疑的事情正在发生……围绕这个话题有一些悬而未决的问题。主要的一点是关于这个问题的讨论已经在进行中。
#![feature(nll)]
use std::io::{BufRead, stdin};
fn foo() -> usize {
let stdin = stdin();
let stdinlock = stdin.lock();
stdinlock
.lines()
.count()
}