【发布时间】:2015-09-06 01:44:11
【问题描述】:
我试图了解如何编写正确的 Rust 代码,但我认为我可能高估了编译器理解对象生命周期的能力。这是我期望它工作的代码:
use std::path::Path;
use std::env;
use rusqlite::SqliteConnection;
struct SomeDatabase {
conn: SqliteConnection,
}
impl SomeDatabase {
fn getPath() -> &Path {
let path = env::home_dir().unwrap();
path.push("foo.sqlite3");
path.as_path()
}
fn open() -> SomeDatabase {
let path = SomeDatabase::getPath()
SomeDatabase { conn: SqliteConnection::open(path).unwrap() }
}
}
fn main() {
let db = SomeDatabase::open();
}
当我尝试编译它时,我收到关于 &Path 上缺少生命周期说明符的错误。我知道如果这从调用者那里获取了一个引用参数,它将与该引用具有相同的生命周期。在这里,虽然我期望的是生命周期将附加到我将结果分配给的变量。
我知道可以显式添加生命周期,但我不知道在这种情况下如何应用它们。编译器建议尝试 'static 生命周期,但据我所知,这在这里没有意义,因为此函数返回值的来源不是静态的。
现在,只是想看看如果我尝试编译其余代码会发生什么,我将返回类型从 &Path 更改为 PathBuf 并在 open() 中调用 as_path()。这导致编译器输出这些错误:
src\main.rs:22:30: 22:52 error: the trait `core::marker::Sized` is not implemented for the type `[u8]` [E0277]
src\main.rs:22 SomeDatabase { conn: SqliteConnection::open(path).unwrap() }
^~~~~~~~~~~~~~~~~~~~~~
src\main.rs:22:30: 22:52 note: `[u8]` does not have a constant size known at compile-time
src\main.rs:22 SomeDatabase { conn: SqliteConnection::open(path).unwrap() }
^~~~~~~~~~~~~~~~~~~~~~
SqliteConnection::open() 返回一个Result<SqliteConnection, SqliteError>,而SqliteConnection 中的唯一字段是RefCell,所以我不明白这个关于字节数组的错误来自哪里。
那么,为什么事情没有按我的预期工作,编写这段代码最生锈的方式是什么?
【问题讨论】:
标签: rust