我在借阅支票员时遇到了一些麻烦。这是代码:
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
有什么想法吗?