Je sais qu'en général, les variables globales doivent être évitées. Néanmoins, je pense que dans un sens pratique, il est parfois souhaitable (dans des situations où la variable fait partie intégrante du programme) de les utiliser.
Afin d'apprendre Rust, j'écris actuellement un programme de test de base de données utilisant sqlite3 et le package Rust / sqlite3 sur GitHub. Par conséquent, cela nécessite (dans mon programme de test) (comme alternative à une variable globale), de passer la variable de base de données entre des fonctions dont il y en a une dizaine. Un exemple est ci-dessous.
Est-il possible, faisable et souhaitable d'utiliser des variables globales dans Rust?
Compte tenu de l'exemple ci-dessous, puis-je déclarer et utiliser une variable globale?
extern crate sqlite;
fn main() {
let db: sqlite::Connection = open_database();
if !insert_data(&db, insert_max) {
return;
}
}
J'ai essayé ce qui suit, mais cela ne semble pas tout à fait correct et a entraîné les erreurs ci-dessous (j'ai également essayé avec un unsafe
bloc):
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),
}
}
Erreurs résultant de la compilation:
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
intérieur d'un Option<Connection>
type et à l'utilisation d'un Option<Connection>
fichier Connection
. Si ces erreurs étaient résolues (en utilisant Some()
) et qu'ils utilisaient un unsafe
bloc, comme ils l'ont essayé à l'origine, leur code fonctionnerait (bien que d'une manière non sécurisée pour les threads).