【发布时间】:2013-11-05 11:23:01
【问题描述】:
我知道,一般来说,要避免使用全局变量。尽管如此,我认为在实际意义上,有时(在变量是程序不可或缺的情况下)使用它们是可取的。
为了学习 Rust,我目前正在使用 sqlite3 和 GitHub 上的 Rust/sqlite3 包编写一个数据库测试程序。因此,这需要(在我的测试程序中)(作为全局变量的替代方案)在大约有十几个函数之间传递数据库变量。下面是一个例子。
在 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) {
| ^^^^
【问题讨论】:
-
如需安全解决方案,请参阅How do I create a global, mutable singleton?。
-
我应该在这里指出,OP 遇到的错误与尝试将
Connection存储在Option<Connection>类型中,并尝试使用Option<Connection>作为Connection.如果这些错误得到解决(通过使用Some())并且他们使用了unsafe块,就像他们最初尝试的那样,他们的代码将可以工作(尽管是以线程不安全的方式)。 -
这能回答你的问题吗? How do I create a global, mutable singleton?
标签: global-variables rust