Saya tahu bahwa secara umum, variabel global harus dihindari. Namun demikian, menurut saya dalam arti praktis, kadang-kadang diinginkan (dalam situasi di mana variabel merupakan bagian integral dari program) untuk menggunakannya.
Untuk mempelajari Rust, saat ini saya sedang menulis program pengujian database menggunakan sqlite3 dan paket Rust / sqlite3 di GitHub. Akibatnya, itu mengharuskan (dalam program uji saya) (sebagai alternatif dari variabel global), untuk meneruskan variabel database antara fungsi yang ada sekitar selusin. Contohnya di bawah ini.
Apakah mungkin dan layak dan diinginkan untuk menggunakan variabel global di Rust?
Dengan contoh di bawah ini, dapatkah saya mendeklarasikan dan menggunakan variabel global?
extern crate sqlite;
fn main() {
let db: sqlite::Connection = open_database();
if !insert_data(&db, insert_max) {
return;
}
}
Saya mencoba yang berikut ini, tetapi tampaknya kurang tepat dan menghasilkan kesalahan di bawah ini (saya mencoba juga dengan unsafe
blok):
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),
}
}
Kesalahan yang dihasilkan dari kompilasi:
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) {
| ^^^^