if-let语句,仍然借用时放在这里

时间:2019-03-16 06:30:59

标签: rust borrow-checker

我在借阅支票员时遇到了一些麻烦。这是代码:

extern crate odbc_safe;

use odbc_safe::*;

fn main() {
    let env = match Environment::new() {
        Return::Success(env) => env,
        _ => panic!(""),
    };
    let env = match env.declare_version_3_8() {
        Return::Success(env) => env,
        _ => panic!(""),
    };
    if let Return::Success(ds) = DataSource::with_parent(&env) {

    }
}

您会看到它取决于odbc_safe条板箱。没有这种依赖性,我无法重现问题,因此代码是这样的。无论如何,它不会编译错误:

error[E0597]: `env` does not live long enough
  --> src\main.rs:14:59
   |
14 |     if let Return::Success(ds) = DataSource::with_parent(&env) {
   |                                                           ^^^ borrowed value does not live long enough
...
17 | }
   | - `env` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

这种行为对我来说很奇怪,因为ds死于if-let的末尾,并释放了对env的引用。但是更奇怪的是,如果我在if-let语句的末尾添加一个分号,使其成为一个表达式,则代码可以正常编译。因此,遵循代码确实可以正常编译:

extern crate odbc_safe;

use odbc_safe::*;

fn main() {
    let env = match Environment::new() {
        Return::Success(env) => env,
        _ => panic!(""),
    };
    let env = match env.declare_version_3_8() {
        Return::Success(env) => env,
        _ => panic!(""),
    };
    if let Return::Success(ds) = DataSource::with_parent(&env) {

    };
}

正如我所说,我没有运气,没有odbc_safe依赖就可以重现问题。我试图从中模仿类型,但是一切都按预期进行。

rust版本: stable-x86_64-pc-windows-gnu(默认) rustc 1.33.0(2aa4c46cf 2019-02-28)

odbc_safe版本:0.4.1

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

该案例似乎存在问题:https://github.com/rust-lang/rust/issues/21114。感谢@Laney。