我刚刚开始看Rust。我想试验一个数据库,并找到了sqlite repo,这是一个不错的实验。
我想知道将sqlite数据库变量传递给函数的“正确”方法。我最初从编译器获得的错误消息似乎表明,当我从main()传递Db变量到函数时,它已经消失,所以我返回了它。虽然这似乎有效,但在我看来这不是正常的方式。虽然我不是大量全局变量的信徒,但我试图创建一个全局变量,但我无法发现如何做到这一点。
以下是测试程序。请注意,我还没有使用Rust命名约定,但这是非常早期的
有问题的主要内容是:
oDb1 = fCreateTable(oDb1);
fn fCreateTable(oDb1:sqlite::database::Database) -> sqlite::database::Database {
什么是替代方案,为什么有必要(在这种情况下)返回它?
示例程序:
extern mod sqlite;
fn main() {
let mut oDb1:sqlite::database::Database;
oDb1 = fOpenDb();
oDb1 = fCreateTable(oDb1) ;
let mut iInsertTot: int = 0;
while iInsertTot < 25 {
let oDbExec = oDb1.exec("INSERT INTO test (sname, iborn) VALUES ('xxxxx', 1973)");
if (! oDbExec.is_ok()) {
fail!(fmt!("Insert Nr. %d Failed!", iInsertTot+1));
}
iInsertTot += 1;
}
println (fmt!("Inserts completed = %d", iInsertTot));
}
fn fOpenDb() -> sqlite::database::Database {
let oDbOpen = sqlite::open("test.db");
if oDbOpen.is_err() {
fail!(fmt!("Error opening test.db: %?", oDbOpen));
}
println(fmt!("Database Open OK? %?", oDbOpen.is_ok()));
oDbOpen.unwrap()
}
fn fCreateTable(oDb1:sqlite::database::Database) -> sqlite::database::Database {
let mut oDbExec = oDb1.exec("drop table if exists test");
println(fmt!("Drop Table OK? %?", oDbExec.is_ok()));
if (!oDbExec.is_ok()) {
fail!("Drop-table failed");
}
oDbExec = oDb1.exec("CREATE TABLE test (ikey INTEGER PRIMARY KEY not null,
sname text, iborn int)");
println(fmt!("Create OK? %?", oDbExec.is_ok()));
if !oDbExec.is_ok() {
fail!("Create Table failed");
}
oDb1
}
答案 0 :(得分:3)
sqlite::database::Database
实现了Drop
,这意味着它有一个析构函数,这意味着它永远不会被复制并且总是被移动:fCreateTable(oDb1)
将数据库对象移出oDb1:现在{{1}中没有任何内容1}}!当然,你可以放回一些东西。例如,当您从oDb1
返回数据库时,再次移回 - fCreateTable
。
但这是一场愚蠢的舞蹈。只是不要首先移动数据库,借用指向它的指针:
fCreateTable