Genel olarak global değişkenlerden kaçınılması gerektiğini biliyorum. Yine de, pratik anlamda (değişkenin programa entegre olduğu durumlarda) bunları kullanmanın bazen istenebileceğini düşünüyorum.
Rust'u öğrenmek için şu anda GitHub'da sqlite3 ve Rust / sqlite3 paketini kullanarak bir veritabanı test programı yazıyorum. Sonuç olarak, bu (benim test programımda) (genel bir değişkene alternatif olarak) veritabanı değişkenini yaklaşık bir düzine var olan fonksiyonlar arasında geçirmeyi gerektirir. Bir örnek aşağıdadır.
Rust'ta global değişkenleri kullanmak mümkün ve uygulanabilir ve arzu edilir mi?
Aşağıdaki örnek göz önüne alındığında, bir global değişken bildirebilir ve kullanabilir miyim?
extern crate sqlite;
fn main() {
let db: sqlite::Connection = open_database();
if !insert_data(&db, insert_max) {
return;
}
}
Aşağıdakini denedim, ancak tam olarak doğru görünmüyor ve aşağıdaki hatalarla sonuçlandı (bir unsafe
blokla da denedim ):
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),
}
}
Derlemeden kaynaklanan hatalar:
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) {
| ^^^^