ฉันรู้ว่าโดยทั่วไปต้องหลีกเลี่ยงตัวแปรส่วนกลาง อย่างไรก็ตามฉันคิดว่าในทางปฏิบัติบางครั้งก็เป็นที่พึงปรารถนา (ในสถานการณ์ที่ตัวแปรเป็นส่วนสำคัญของโปรแกรม) ที่จะใช้พวกเขา
เพื่อเรียนรู้ 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) {
| ^^^^