나는 일반적으로 전역 변수를 피하는 것을 알고있다. 그럼에도 불구하고 실용적인 측면에서 볼 때 변수를 사용하는 것이 바람직합니다 (변수가 프로그램에 필수적인 상황에서).녹에서 글로벌 변수를 사용할 수 있습니까?
녹을 배우려면 현재 GitHub에서 sqlite3 및 Rust/sqlite3 패키지를 사용하여 데이터베이스 테스트 프로그램을 작성하고 있습니다. 결과적으로 (전역 변수의 대안으로) (내 테스트 프로그램에서) 약 12 개의 함수 사이에서 데이터베이스 변수를 전달해야합니다. 다음은 그 예입니다.
녹스에서 전역 변수를 사용하는 것이 가능하고 실현 가능합니까?
아래 예제에서 전역 변수를 선언하고 사용할 수 있습니까?
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) {
| ^^^^
** 안전 ** 솔루션, 내가 세계를 만들려면 어떻게해야합니까 [참조하십시오 : 그것은 사용자의 입력에 따라, 당신은 또한이 경우는 다루기 힘든 비트를 얻을 접근에, 거기에
Option
가 발생 할 수 있습니다 , mutable singleton?] (http://stackoverflow.com/q/27791532/155423). – Shepmaster