Я знаю, що загалом слід уникати глобальних змінних. Тим не менше, я думаю, що в практичному сенсі іноді бажано (у ситуаціях, коли змінна є невід'ємною частиною програми) використовувати їх.
Для того, щоб вивчити Rust, я зараз пишу програму тестування бази даних, використовуючи sqlite3 та пакет Rust / sqlite3 на GitHub. Отже, це вимагає (у моїй тестовій програмі) (як альтернативу глобальній змінній) передавати змінну бази даних між функціями, яких існує близько десятка. Приклад наведено нижче.
Чи можливо, можливо і бажано використовувати глобальні змінні в Rust?
Враховуючи приклад нижче, чи можу я оголосити та використовувати глобальну змінну?
extern crate sqlite;
fn main() {
let db: sqlite::Connection = open_database();
if !insert_data(&db, insert_max) {
return;
}
}
Я спробував наступне, але, здається, це не зовсім правильно, і це призвело до помилок нижче (я також спробував із unsafe
блоком):
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),
}
}
Помилки в результаті компіляції:
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
усередині Option<Connection>
типу та спробою використовувати Option<Connection>
як Connection
. Якби ці помилки були усунені (за допомогою Some()
), і вони використовували unsafe
блок, як це було спочатку, їх код працював би (хоч і небезпечно для потоку).