私はRustを見始めたばかりです。私はデータベースを試してみたかったのですが、実験するのに適した sqlite リポジトリを見つけました。
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
}