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() {}

如评论中所述,存在多个与此相关的锈蚀问题:

我无法回答您问题的原因,但我可以声明,当前1的非词汇生存期实现允许编译原始代码:

#![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()
}