Ich weiß, dass globale Variablen generell vermieden werden müssen. Dennoch denke ich im praktischen Sinne, dass es manchmal wünschenswert ist (in Situationen, in denen die Variable ein integraler Bestandteil des Programms ist), sie zu verwenden.
Um Rust zu lernen, schreibe ich derzeit ein Datenbanktestprogramm mit sqlite3 und dem Rust / sqlite3-Paket auf GitHub. Folglich erfordert dies (in meinem Testprogramm) (als Alternative zu einer globalen Variablen), die Datenbankvariable zwischen Funktionen zu übergeben, von denen es ungefähr ein Dutzend gibt. Ein Beispiel ist unten.
Ist es möglich und machbar und wünschenswert, globale Variablen in Rust zu verwenden?
Kann ich im folgenden Beispiel eine globale Variable deklarieren und verwenden?
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 zu sein und führte zu den folgenden Fehlern (ich habe es auch mit einem unsafe
Block versucht ):
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 beim 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) {
| ^^^^
Connection
in einem Option<Connection>
Typ zu speichern und einen Option<Connection>
als zu verwenden Connection
. Wenn diese Fehler behoben würden (mithilfe von Some()
) und sie einen unsafe
Block verwenden würden, wie sie ursprünglich versucht hatten, würde ihr Code funktionieren (wenn auch auf eine thread-unsichere Weise).