So che in generale le variabili globali devono essere evitate. Tuttavia, penso in senso pratico, a volte è auspicabile (in situazioni in cui la variabile è parte integrante del programma) utilizzarli.
Per imparare Rust, sto attualmente scrivendo un programma di test del database usando sqlite3 e il pacchetto Rust / sqlite3 su GitHub. Di conseguenza, ciò richiede (nel mio programma di test) (in alternativa a una variabile globale), di passare la variabile del database tra le funzioni di cui ce ne sono circa una dozzina. Di seguito è riportato un esempio.
È possibile, fattibile e desiderabile utilizzare variabili globali in Rust?
Dato l'esempio seguente, posso dichiarare e utilizzare una variabile globale?
extern crate sqlite;
fn main() {
let db: sqlite::Connection = open_database();
if !insert_data(&db, insert_max) {
return;
}
}
Ho provato quanto segue, ma non sembra essere del tutto corretto e ha provocato gli errori seguenti (ho provato anche con un unsafe
blocco):
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),
}
}
Errori derivanti dalla compilazione:
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
all'interno di un Option<Connection>
tipo, e cercando di utilizzare un Option<Connection>
come Connection
. Se quegli errori fossero stati risolti (usando Some()
) e usassero un unsafe
blocco, come hanno provato originariamente, il loro codice funzionerebbe (anche se in un modo non sicuro per i thread).