2013-10-22 4 views
1

나는 방금 녹을보기 시작했습니다. 나는 데이터베이스를 실험하고 싶었고, 실험해야 할 sqlite repo를 발견했다.녹스의 함수에 데이터베이스 변수를 전달하는 방법은 무엇입니까?

저는 함수에 sqlite 데이터베이스 변수를 전달하는 "올바른"방법을 알고 싶습니다. 컴파일러에서 처음 얻은 오류 메시지는 main()에서 Db 변수를 함수에 전달하면 사라 졌음을 나타냈다. 이것이 효과가있는 것으로 보일지라도, 그것은 정상적인 길일 것 같지 않습니다. 저는 많은 전역 변수를 믿는 사람이 아니지만 전역 변수를 만들려고 시도했지만 그 방법을 발견 할 수 없었습니다.

다음은 테스트 프로그램입니다. (에서

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 
} 

답변

3

sqlite::database::Database는 복사하지 않고 항상 이동 결코 의미가 소멸자를 가지고 의미 Drop을 구현 oDb1에서 데이터베이스 개체를 이동 fCreateTable(oDb1) : 이제 oDb1에 남아 아무것도! 물론, 당신은 뭔가를 되돌릴 수 있습니다. 예를 들어 fCreateTable에서 데이터베이스를 반환하면 다시 fCreateTable으로 이동합니다.

그러나 이것은 바보 같은 춤입니다. 처음에는 데이터베이스를 이동하지 말고 포인터를 빌려 다음 포인터를 사용하십시오.

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

fn fCreateTable(oDb1: &sqlite::database::Database) { 
    ... 
}