1

私は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
}
4

1 に答える 1

3

sqlite::database::Databaseこれは、デストラクタがあることDropを意味し、コピーされることはなく、常に移動されることを意味します:fCreateTable(oDb1)データベース オブジェクトを oDb1 から移動しますoDb1。もちろん、何かを元に戻すことができます。たとえば、データベースを から戻すと、fCreateTable再び に戻りますfCreateTable

しかし、これはばかげたダンスです。そもそもデータベースを移動しないでください。データベースへのポインタを借りました。

fn main() {
    let oDb1 = fOpenDb();
    fCreateTable(&oDb1);
    ...
}

fn fCreateTable(oDb1: &sqlite::database::Database) {
    ...
}
于 2013-10-22T20:55:35.007 に答える