일반적으로 전역 변수는 피해야한다는 것을 알고 있습니다. 그럼에도 불구하고 실용적인 의미에서 때때로 변수를 사용하는 것이 바람직하다고 생각합니다 (변수가 프로그램에 필수적인 상황에서).
Rust를 배우기 위해 저는 현재 GitHub에서 sqlite3와 Rust / sqlite3 패키지를 사용하는 데이터베이스 테스트 프로그램을 작성하고 있습니다. 결과적으로 (내 테스트 프로그램에서) (전역 변수의 대안으로) 약 12 개의 함수 사이에 데이터베이스 변수를 전달해야합니다. 예는 다음과 같습니다.
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
블록 을 사용하면 원래 시도한대로 코드가 작동합니다 (스레드에 안전하지 않은 방식 임에도 불구하고).