Ist es möglich, globale Variablen in Rust zu verwenden?

Ich weiß, dass im Allgemeinen, Globale Variablen sind zu vermeiden. Trotzdem denke ich, im praktischen Sinne, ist es manchmal wünschenswert, (in Situationen, in denen die variable ist integraler Bestandteil des Programms), Sie zu verwenden.

Um zu lernen, Rost, Schreibe ich momentan ein Datenbank-test-Programm mit sqlite3 und die Rost - /sqlite3-Paket auf GitHub. Folglich erfordert, dass (in meinem test-Programm) (als alternative zu einer globalen variable), vorbei an der Datenbank variable zwischen Funktionen, von denen es etwa ein Dutzend. Ein Beispiel ist unten.

  1. Ist es möglich und machbar und wünschenswert, die Verwendung von globalen Variablen in Rust?
  2. Gegeben, wie das Beispiel unten kann ich erklären, und verwenden Sie eine Globale variable?
extern crate sqlite;

fn main() {
    let db: sqlite::Connection = open_database();

    if !insert_data(&db, insert_max) {
        return;
    }
}

Ich habe Folgendes versucht, aber es scheint nicht ganz richtig und führte in der unten stehenden Fehlerliste (ich habe versucht, auch mit einer unsafe block):

extern crate sqlite;

static mut DB: Option<sqlite::Connection> = None;

fn main() {
    DB = sqlite::open("test.db").expect("Error opening test.db");
    println!("Database Opened OK");

    create_table();
    println!("Completed");
}

//Create Table
fn create_table() {
    let sql = "CREATE TABLE IF NOT EXISTS TEMP2 (ikey INTEGER PRIMARY KEY NOT NULL)";
    match DB.exec(sql) {
        Ok(_) => println!("Table created"),
        Err(err) => println!("Exec of Sql failed : {}\nSql={}", err, sql),
    }
}

Fehler führte kompilieren:

error[E0308]: mismatched types
 --> src/main.rs:6:10
  |
6 |     DB = sqlite::open("test.db").expect("Error opening test.db");
  |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `std::option::Option`, found struct `sqlite::Connection`
  |
  = note: expected type `std::option::Option<sqlite::Connection>`
             found type `sqlite::Connection`

error: no method named `exec` found for type `std::option::Option<sqlite::Connection>` in the current scope
  --> src/main.rs:16:14
   |
16 |     match DB.exec(sql) {
   |              ^^^^

InformationsquelleAutor der Frage Brian Oh | 2013-10-26

Schreibe einen Kommentar