Tôi biết rằng nói chung, cần tránh các biến toàn cục. Tuy nhiên, tôi nghĩ theo nghĩa thực tế, đôi khi người ta mong muốn (trong các tình huống mà biến là tích phân của chương trình) để sử dụng chúng.
Để học Rust, tôi hiện đang viết một chương trình kiểm tra cơ sở dữ liệu sử dụng sqlite3 và gói Rust / sqlite3 trên GitHub. Do đó, điều đó đòi hỏi (trong chương trình thử nghiệm của tôi) (như một sự thay thế cho một biến toàn cục), để chuyển biến cơ sở dữ liệu giữa các hàm trong đó có khoảng một tá hàm. Dưới đây là một ví dụ.
Việc sử dụng các biến toàn cục trong Rust có khả thi và khả thi không?
Với ví dụ dưới đây, tôi có thể khai báo và sử dụng một biến toàn cục không?
extern crate sqlite;
fn main() {
let db: sqlite::Connection = open_database();
if !insert_data(&db, insert_max) {
return;
}
}
Tôi đã thử các cách sau, nhưng nó có vẻ không đúng và dẫn đến các lỗi bên dưới (tôi cũng đã thử với một unsafe
khối):
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),
}
}
Lỗi do biên dịch:
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
bên trong một Option<Connection>
loại và cố gắng sử dụng một Option<Connection>
dưới dạng Connection
. Nếu những lỗi đó được giải quyết (bằng cách sử dụng Some()
) và họ sử dụng một unsafe
khối, như họ đã thử ban đầu, thì mã của họ sẽ hoạt động (mặc dù theo cách không an toàn theo luồng).